【问题标题】:Django how to filter queryset based on nested many to many relations in one queryDjango如何在一个查询中根据嵌套的多对多关系过滤查询集
【发布时间】:2017-07-15 15:07:26
【问题描述】:

假设我有一个产品可以有各种子产品,模型是这样定义的

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)

我的目标是检索具有一个或多个与特定国家/地区相关联的产品的所有产品。

在我的用例中,我需要将此信息作为查询集。我尝试过的是这个并且它有效:

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 过滤这样的查询集?

【问题讨论】:

    标签: python django django-models django-queryset django-orm


    【解决方案1】:

    您可以使用双下划线语法简单地遵循关系。所以:

    desired_queryset = Product.objects.filter(children__countries= desired_country)
    

    【讨论】:

      猜你喜欢
      • 2020-01-24
      • 2019-09-20
      • 2016-11-07
      • 2013-05-29
      • 2020-04-30
      • 1970-01-01
      • 2018-01-05
      • 2016-05-05
      • 1970-01-01
      相关资源
      最近更新 更多