创建满足两个条件的django查询,涉及到相关的模型



我有两个模型,比方说:

class Order(models.Model):
# ... fields
class Product(models.Model):
quantity = models.PositiveIntegerField(null=False, blank=False, default=1)
order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='products')
b_product = models.ForeignKey(BaseProduct, null=False, blank=False, on_delete=models.CASCADE)
class BaseProduct(models.Model):
type = #.... choices = [rtProduct, rtPack]

我想做一个查询,包括所有的Orders,有一个以上的Product与它相关,或者如果至少一个Product有一个quantity大于1,或者如果BaseProduct类型是rtProduct

第一部分是这样的:

queryset = Order.objects.annotate(products_count=Count('products')).filter(products_count__gt=1)

我坚持添加OR条件也包括其他条件。提前谢谢你。

您可以总结数量并确定Order是否有两个或多个项目:

from django.db.models importSum
Order.objects.alias(
num_items=Sum('product__quantity')
).filter(num_items__gt=1)

或django-3.2之前版本使用:

from django.db.models importSum
Order.objects.annotate(
num_items=Sum('product__quantity')
).filter(num_items__gt=1)

如果可能有一个Order对象的数量小于或等于1,我们应该做不同的处理,并使用:

from django.db.models import Count, Exists, OuterRef, Q
Order.objects.alias(
n_items=Count('product')
).filter(
Q(n_item__gt=1) | Exists(
Product.objects.filter(order_id=OuterRef('pk'), quantity__gt=1)
)
)

或django-3.2之前版本:

from django.db.models import Count, Exists, OuterRef, Q
Order.objects.annotate(
n_items=Count('product')
).filter(
Q(n_item__gt=1) | Exists(
Product.objects.filter(order_id=OuterRef('pk'), quantity__gt=1)
)
)

相关内容

  • 没有找到相关文章