@mkone112
Начинающий питонист.

Как совместить Case и Count в аннотации?

Имеются связанные модели, предположим модель товара у которого есть покупатель.
class Customer(models.Model):
    ...

class Product(models.Model):
    customer = models.ForeignKey(Customer, related_name='customer')
    date_sell = models.DateField(...)

Я хочу для каждого товара купленного пользователем определить, покупал ли этот пользователь товары ранее. Для этого я выполняю аннотацию дважды, сначала подсчитываю предыдущие покупки, а затем в зависимости от результата добавляю вторую аннотацию.

Product.objects.annotate(
    prev_purchase_count=Count(
        'customer__product__id',
        filter=Q(
            customer__product__date_start__lte=F('date_start'),
        ) & ~Q(id=F('customer__product__id'))
    ),
).annotate(
    purchase_type=Case(
        When(prev_purchase_count=0, then=Value('Первая покупка')),
        default=Value('Повторная покупка'),
        output_field=TextField(),
    )
)

Вопрос - есть ли более элегантный способ сделать это?
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы