1

我有两个模型,比方说:

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大于quantity1或者BaseProduct类型是否为rtProduct

对于第一部分,我有这个:

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

我坚持添加OR条件以包括其他条件。非常感谢你。

4

1 回答 1

1

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

from django.db.models import Sum

Order.objects.alias(
    num_items=Sum('product__quantity')
).filter(num_items__gt=1)

或在之前:

from django.db.models import Sum

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

或在之前:

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)
    )
)
于 2021-10-13T15:01:33.957 回答