Создайте 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)

или до с:

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

или до :

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)
    )
)
Вернуться на верх