Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django过滤器反向外键_Python_Django_Django Queryset - Fatal编程技术网

Python Django过滤器反向外键

Python Django过滤器反向外键,python,django,django-queryset,Python,Django,Django Queryset,我在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) ... 如何对订单

我在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)

...
如何对订单编写查询,从而只生成至少具有一个相关子订单1或子订单2的订单?我需要像这样的东西

Order.objects.filter(suborder__count__ge = 1, ...)
我使用Django=1.9.2和Python=3.4.1对相关模型进行计数:

from django.db.models import Count

queryset = Order.objects.annotate(
    num_suborder1=Count('suborder1', distinct=True),
    num_suborder2=Count('suborder2', distinct=True),
)
请参阅关于解释我们为什么需要
distinct=True

然后,您可以使用
Q
筛选计数至少为1的对象

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

您可以从
Order
访问
子订单1

order = Order.objects.get(pk=pk)
suborders1 = order.suborder1_set.all()
然后您可以遍历子订单:

for suborder in suborders1:
  print (suborder)

希望它能帮助您

我刚刚找到的解决方案如下:

Order.objects.filter(suborder1__id__gt = -1)
我也可以用同样的方法来处理第2子订单。这是一个解决方案,但不是真正的djangonic。有更好的解决方案吗?

使用字段查找:

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

请注意,您可能会得到每个子订单的重复结果。您可以使用
distinct()
来避免这种情况。谢谢,这正是我想要的。除非您使用
distinct()
,否则可能会出现重复。