Django 过滤器反向外键

Django filter reversed foreignkey

我在 Django 应用程序中有这些表:

class Order(models.Model):
    ...

class SubOrder1(models.Model):
    order = models.ForeignKey(Order, blank=True, null=True)

class SubOrder2(models.Model):
    order = models.ForeignKey(Order, blank=True, null=True)

...

我如何编写一个查询订单,只返回至少有一个相关的 SubOrder1 或 SubOrder2 的订单?我需要类似

的东西
Order.objects.filter(suborder__count__ge = 1, ...)

我正在使用 Django = 1.9.2 和 Python = 3.4.1

Annotate your queryset 与相关模型的计数:

from django.db.models import Count

queryset = Order.objects.annotate(
    num_suborder1=Count('suborder1', distinct=True),
    num_suborder2=Count('suborder2', distinct=True),
)

查看关于 combining multiple aggregations 的文档来解释为什么我们需要 distinct=True

然后您可以使用 Q 过滤其中一个计数至少为 1 的对象。

orders_with_suborders = queryset.filter(
    Q(num_suborder1__gte=1) | Q(num_suborder1=1__gte=1),
)

您可以从 Order 到达 SubOrder1

order = Order.objects.get(pk=pk)
suborders1 = order.suborder1_set.all()

然后您可以遍历子订单:

for suborder in suborders1:
  print (suborder)

希望对你有帮助

我刚找到的解决方案是这样的:

Order.objects.filter(suborder1__id__gt = -1)

我可以对 SubOrder2 使用相同的方法。这是一个解决方案,但不是真正的 djangonic。有没有更好的解决方案?

使用isnull字段查找:

orders_with_suborders = Order.objects.filter(
    Q(suborder1__isnull=False) | Q(suborder2__isnull=False)
)