创建满足涉及相关模型的两个条件的django查询
Create django query satisfying two conditions involving related models
我有两个模型,比方说:
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 import <strong>Sum</strong>
Order.objects.alias(
<strong>num_items=Sum('product__quantity')</strong>
).filter(num_items__gt=1)
或在 django-3.2 之前:
from django.db.models import <strong>Sum</strong>
Order.objects.annotate(
<strong>num_items=Sum('product__quantity')</strong>
).filter(num_items__gt=1)
如果 Order
个对象的数量小于或等于 1 是可能的,我们应该以不同的方式进行处理,并使用:
from django.db.models import Count, Exists, OuterRef, Q
Order.objects.alias(
n_items=Count('product')
).filter(
<strong>Q(</strong>n_item__gt=1<strong>) | Exists(</strong>
Product.objects.filter(order_id=OuterRef('pk'), quantity__gt=1)
<strong>)</strong>
)
或在 django-3.2 之前:
from django.db.models import Count, Exists, OuterRef, Q
Order.objects.annotate(
n_items=Count('product')
).filter(
<strong>Q(</strong>n_item__gt=1<strong>) | Exists(</strong>
Product.objects.filter(order_id=OuterRef('pk'), quantity__gt=1)
<strong>)</strong>
)
我有两个模型,比方说:
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 import <strong>Sum</strong>
Order.objects.alias(
<strong>num_items=Sum('product__quantity')</strong>
).filter(num_items__gt=1)
或在 django-3.2 之前:
from django.db.models import <strong>Sum</strong>
Order.objects.annotate(
<strong>num_items=Sum('product__quantity')</strong>
).filter(num_items__gt=1)
如果 Order
个对象的数量小于或等于 1 是可能的,我们应该以不同的方式进行处理,并使用:
from django.db.models import Count, Exists, OuterRef, Q
Order.objects.alias(
n_items=Count('product')
).filter(
<strong>Q(</strong>n_item__gt=1<strong>) | Exists(</strong>
Product.objects.filter(order_id=OuterRef('pk'), quantity__gt=1)
<strong>)</strong>
)
或在 django-3.2 之前:
from django.db.models import Count, Exists, OuterRef, Q
Order.objects.annotate(
n_items=Count('product')
).filter(
<strong>Q(</strong>n_item__gt=1<strong>) | Exists(</strong>
Product.objects.filter(order_id=OuterRef('pk'), quantity__gt=1)
<strong>)</strong>
)