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

如何在django中获取一组对象的向后关系?,django,django-orm,Django,Django Orm,我有一个城市和省的模型: class Province(Model): name = CharField(...) class City(Model): name = CharField(...) province = ForeignKey(Province,......, related_name='cities') 假设我已按如下方式填充数据库: ontario = Province.objects.create(name='Ontario') quebec =

我有一个城市和省的模型:

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()
我可以检索安大略省所有城市的查询集,如下所示:

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中有两个对象:多伦多和滑铁卢 我怎样才能拥有安大略省和魁北克省所有城市的查询集? 假设我有一个拥有安大略省和魁北克省的queryset,例如:

my_province_query = Province.objects.exclude(name__contains="Alberta")
我想用这个查询集去多伦多、滑铁卢和蒙特利尔

我首先尝试了我的\u province\u query.objects.all(),但不可能做到这一点,因为查询不是获取其对象的模型。有什么建议吗?
请注意,我需要一个查询集中的所有对象。我曾想过运行两个不同的查询,然后将它们合并在一起,但我正在寻找一种更好的方法

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

city_names = Province.objects.exclude(name__contains="Alberta").values_list('cities__name', flat=True)
# city_names == <QuerySet ['Toronto', 'Waterloo', 'Montreal']>
如果您想让
City
实例只命中数据库一次,则必须使用
City
编写查询:

从django.db.models导入Q
cities=City.objects.filter(~Q(省名)['Alberta']))
#城市==

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

city_names = Province.objects.exclude(name__contains="Alberta").values_list('cities__name', flat=True)
# city_names == <QuerySet ['Toronto', 'Waterloo', 'Montreal']>
如果您想让
City
实例只命中数据库一次,则必须使用
City
编写查询:

从django.db.models导入Q
cities=City.objects.filter(~Q(省名)['Alberta']))
#城市==

谢谢。第二种情况是我的答案。然而,我是django的新手,不明白这个“值列表”是什么,“flat=True”@AminBa
values\u list
从实例中选择一个或多个值,而不是返回实例本身。默认情况下,
values\u list
返回的每个值都包装在元组中,
flat=True
删除元组。只要在这些选项上玩一点,你就会看到它们的不同。我问了另一个问题。如果你也能帮我,我将不胜感激:stackoverflow.com/q/57133510/11065874–谢谢。第二种情况是我的答案。然而,我是django的新手,不明白这个“值列表”是什么,“flat=True”@AminBa
values\u list
从实例中选择一个或多个值,而不是返回实例本身。默认情况下,
values\u list
返回的每个值都包装在元组中,
flat=True
删除元组。只要在这些选项上玩一点,你就会看到它们的不同。我问了另一个问题。如果您也能帮我解决这个问题,我将不胜感激:stackoverflow.com/q/5713510/11065874–