Django фильтр после использования запроса select_related - PullRequest
1 голос
/ 06 мая 2020

Проходим через фильтр, который я использовал для select_related

Это моя модель для покупки:

class Purchase(models.Model):
    amount = models.FloatField(default=1)
    entry_by = models.ForeignKey(
        User,
        on_delete=models.SET_NULL,
        related_name='ledger_entry_by',
    )
    is_cash = models.BooleanField(default=False)

, а это моя модель потребления:

class Consume(models.Model):
    amount = models.FloatField(default=1)
    consumed_by = models.ForeignKey(
        User,
        on_delete=models.SET_NULL,
        related_name='consume_entry_for',
    )

Это мой запрос

user_wise_cost = User.objects.annotate(
            difference=ExpressionWrapper(
                Coalesce(Sum('ledger_entry_by__amount'), Value(0)) - Coalesce(Sum('consume_entry_for__amount'), Value(0)),
                output_field=FloatField()
            )
        )

Вышеупомянутый запрос отлично работает в соответствии с моими требованиями.

Я хочу рассчитать только ту сумму, которую cash заплатил, я имею в виду, если запись is_cash=True, она будет рассчитана

Мое требование было:

например, пользователь купил 500 долларов США и потребил 550 долларов США, то есть , ему нужно заплатить еще 50 долларов, другой пользователь купил 440 долларов, но он израсходовал 400 долларов, то есть он получит возмещение в размере 40 долларов. Другой пример пользователя: пользователь ничего не покупал, но потратил 300 долларов, поэтому ему нужно заплатить 300 долларов. также, если пользователь ничего не покупал и не потреблял, но его данные должны отображаться как 0.

Прежде всего, требование было успешно выполнено этим запросом, нет никаких проблем, кроме в настоящее время он вычисляет как cash, так и due количество, но я хочу, чтобы было рассчитано только около sh количество.

для этого, я отфильтровал его следующим образом:

user_wise_cost = User.objects.annotate(
            difference=ExpressionWrapper(
                Coalesce(Sum('ledger_entry_by__amount'), Value(0)) - Coalesce(Sum('consume_entry_for__number_of_meal'), Value(0)),
                output_field=FloatField()
            )
        ).filter(
            ledger_entry_by__is_cash=True
        )

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

Может ли кто-нибудь помочь мне рассчитать только приблизительную sh сумму?

1 Ответ

0 голосов
/ 06 мая 2020

Вместо фильтрации всего набора запросов вы должны передать фильтр в агрегированное выражение:

from django.db.models import Q

user_wise_cost = User.objects.annotate(
            difference=ExpressionWrapper(
                Coalesce(Sum('ledger_entry_by__amount', filter=Q(ledger_entry_by__is_cash=True)), Value(0)) - Coalesce(Sum('consume_entry_for__number_of_meal', filter=Q(ledger_entry_by__is_cash=True)), Value(0)),
                output_field=FloatField()
            )
        )
...