Django 如何根据一个查询中嵌套的多对多关系过滤查询集
Django how to filter queryset based on nested many to many relations in one query
假设我有一个产品可以有各种子产品,模型是这样定义的
class Country(models.Model):
name = models.CharField()
class Product(models.Model):
parent = models.ForeignKey(
'self', null=True, blank=True, related_name='children')
name = models.CharField()
countries = models.ManyToManyField(Country)
我的目标是检索具有一个或多个 child products 且链接到特定国家/地区的所有产品。
在我的用例中,我需要此信息作为查询集。我试过的是这个并且有效:
valid_products = []
desired_country = Country.objects.get(name='mycountry')
for product in Product.objects.all():
for child in product.children.all():
countries = child.countries.all()
for country in countries:
if country == desired_country:
valid_products.append(product.id)
desired_queryset = Product.objects.filter(pk__in=valid_products)
此方法需要额外的查询才能将我的结果转换为查询集,我想避免这种情况。
是否可以直接使用 Django ORM 过滤这样的查询集?
您可以简单地遵循使用双下划线语法的关系。所以:
desired_queryset = Product.objects.filter(children__countries= desired_country)
假设我有一个产品可以有各种子产品,模型是这样定义的
class Country(models.Model):
name = models.CharField()
class Product(models.Model):
parent = models.ForeignKey(
'self', null=True, blank=True, related_name='children')
name = models.CharField()
countries = models.ManyToManyField(Country)
我的目标是检索具有一个或多个 child products 且链接到特定国家/地区的所有产品。
在我的用例中,我需要此信息作为查询集。我试过的是这个并且有效:
valid_products = []
desired_country = Country.objects.get(name='mycountry')
for product in Product.objects.all():
for child in product.children.all():
countries = child.countries.all()
for country in countries:
if country == desired_country:
valid_products.append(product.id)
desired_queryset = Product.objects.filter(pk__in=valid_products)
此方法需要额外的查询才能将我的结果转换为查询集,我想避免这种情况。
是否可以直接使用 Django ORM 过滤这样的查询集?
您可以简单地遵循使用双下划线语法的关系。所以:
desired_queryset = Product.objects.filter(children__countries= desired_country)