【问题标题】:Pythonically filter Django queryset based on lack of reverse relationships基于缺乏反向关系以 Python 方式过滤 Django 查询集
【发布时间】:2016-01-26 03:00:08
【问题描述】:

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

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

我想生成一组所有没有被任何产品对象引用的制造商对象。我可以想出很多方法来获得这个集合,但没有一个看起来很干净或 Pythonic

  1. 给定所有产品的查询集,生成一组拥有产品的所有制造商。然后将所有制造商的集合差与这里描述的manufacturers_with_products:How to get the difference of two querysets in Django
  2. 根据缺少与任何产品的反向关系过滤制造商对象。 Django 可以很容易地根据反向关系的属性进行过滤,但是我找不到一种干净的方法来根据这种反向关系的存在进行过滤。

例如,我可以简单地过滤至少有一个满足条件的产品的制造商:

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

我希望能够过滤更多类似的东西

models.Manufacturer.objects.exclude(product__exists)

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

【问题讨论】:

标签: django


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 2012-11-18
    • 2011-03-23
    • 2016-11-22
    • 1970-01-01
    • 2016-11-07
    • 2016-07-01
    相关资源
    最近更新 更多