代码之家  ›  专栏  ›  技术社区  ›  Amin Ba

如何在django中获取一组对象的向后关系?

  •  0
  • Amin Ba  · 技术社区  · 5 年前

    class Province(Model):
        name = CharField(...)
    
    
    class City(Model):
        name = CharField(...)
        province = ForeignKey(Province,......, related_name='cities')
    

    假设我已按如下方式填充数据库:

    ontario = Province.objects.create(name='Ontario')
    quebec = Province.objects.create(name='Quebec')
    alberta = Province.objects.create(name='alberta')
    toronto = City.objects.create(province=ontario, name='Toronto')
    waterloo = City.objects.create(province=ontario, name='Waterloo')
    montreal = City.objects.create(province=quebec, name='Montreal')
    calgary = City.objects.create(province=alberta, name='Calgary')
    
    

    我可以检索安大略省所有城市的查询集,如下所示:

    ontario.cities.all()
    

    上面的queryset中有两个对象:多伦多和滑铁卢 我怎样才能拥有安大略省和魁北克省所有城市的查询集?

    my_province_query = Province.objects.exclude(name__contains="Alberta")
    

    我想用这个查询集去多伦多、滑铁卢和蒙特利尔

    请注意,我需要一个查询集中的所有对象。我曾想过运行两个不同的查询,然后将它们合并在一起,但我正在寻找更好的方法

    1 回复  |  直到 5 年前
        1
  •  0
  •   niekas    5 年前

    如果只需要城市名称,则查询可能如下所示:

    city_names = Province.objects.exclude(name__contains="Alberta").values_list('cities__name', flat=True)
    # city_names == <QuerySet ['Toronto', 'Waterloo', 'Montreal']>
    

    City 您可以选择的实例

    city_pks = Province.objects.exclude(name__contains="Alberta").values_list('cities__pk', flat=True)
    cities = City.objects.filter(pk__in=city_pks)
    # cities == <QuerySet [<City: Toronto>, <City: Waterloo>, <City: Montreal>]
    

    城市 实例只命中数据库一次,您必须使用 Manager

    from django.db.models import Q
    
    cities = City.objects.filter(~Q(province__name__in=['Alberta']))
    # cities == <QuerySet [<City: Toronto>, <City: Waterloo>, <City: Montreal>]>