Python Django过滤器反向外键
我在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) ... 如何对订单
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()
,否则可能会出现重复。