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