我有两个模型,比方说:
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)
)
)