Создайте 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')
Я хочу сделать запрос, который включает все Orders
, которые имеют более одного Product
, связанного с ним, или если хотя бы один Product
имеет quantity
больше чем 1
.
Для первой части у меня есть следующее:
queryset = Order.objects.annotate(products_count=Count('products')).filter(products_count__gt=1)
Я застрял на добавлении условия OR
, чтобы также включить другое условие.
Заранее большое спасибо.
Вы можете суммировать количество и определить, есть ли в Order
два предмета или больше, с помощью:
from django.db.models import Sum
Order.objects.alias(
num_items=Sum('product__quantity')
).filter(num_items__gt=1)
или до django-3.2 с:
from django.db.models import Sum
Order.objects.annotate(
num_items=Sum('product__quantity')
).filter(num_items__gt=1)
Если возможно иметь объект Order
с количеством меньше или равным единице, мы должны сделать это по-другому, и работать с:
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)
)
)