基于缺乏反向关系,以Python格式过滤Django查询集

时间:2015-10-26 20:55:45

标签: django

假设我有两个Django型号,让我们说产品和制造商,并希望找到没有产品的制造商。

class Product(Model):
    name = models.CharField()
    manufacturer = models.ForeignKey(Manufacturer)
class Manufacturer(Model):
    name = models.CharField()

我想生成一组所有未被任何产品对象引用的制造商对象。我可以想出很多方法来获得这个设置,但它们似乎都不干净或 Pythonic

  1. 鉴于所有产品的查询集,生成一组具有产品的制造商。然后按照此处所述的manufacturer_with_products采用所有制造商的设定差异:How to get the difference of two querysets in Django
  2. 根据与任何产品缺乏反向关系过滤制造商对象。 Django可以很容易地根据反向关系的属性进行过滤,但是我找不到基于这种反向关系的存在进行过滤的简洁方法。
  3. 例如,我可以简单地过滤至少有一种产品满足条件的制造商:

    models.Manufacturer.objects.filter(product__name=x)
    

    我希望能够过滤更像

    的内容
    models.Manufacturer.objects.exclude(product__exists)
    

    我可能会对产品的某些公理/重言式排除/过滤制造商,但这似乎也不是Pythonic。

1 个答案:

答案 0 :(得分:1)

这可以使用annotation和过滤器来完成:

from django.db.models import Count
idle = Manufacturers.objects.annotate(num_products=Count('product')).filter(num_products=0)

idle将包含没有产品的制造商列表,但请记住,他们还会有一个属性num_products,由于查询将为0。