Django过滤器反转了外键

时间:2016-11-23 17:32:42

标签: python django django-queryset

我在django app中有这些表:

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)

...

如何在Order上编写一个查询,该查询只产生至少有一个相关SubOrder1或SubOrder2的订单?我需要像

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

我使用的是Django = 1.9.2和Python = 3.4.1

4 个答案:

答案 0 :(得分:2)

使用isnull字段查找:

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

答案 1 :(得分:1)

Annotate your queryset包含相关模型的计数:

distinct=True

请参阅有关combining multiple aggregations的文档,以解释我们需要Q

的原因

然后,您可以使用orders_with_suborders = queryset.filter( Q(num_suborder1__gte=1) | Q(num_suborder1=1__gte=1), ) 过滤其中任何一个计数至少为1的对象。

SubOrder1

答案 2 :(得分:0)

我刚发现的解决方案就像:

Order.objects.filter(suborder1__id__gt = -1)

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

答案 3 :(得分:-1)

您可以从Order转到order = Order.objects.get(pk=pk) suborders1 = order.suborder1_set.all()

for suborder in suborders1:
  print (suborder)

然后你可以遍历子订单:

private preview(url):Promise<any> {
    http.get(url, {withCredentials: false})
    .toPromise()
    .etc ...

希望对你有帮助