Объединить ~ Q и F в Джанго? - PullRequest
       8

Объединить ~ Q и F в Джанго?

0 голосов
/ 17 сентября 2018

Запрос

Balance.objects.filter(~Q(fax_date=F('paused_date')))

возвращает пустые qs, даже если у меня есть объекты, которые соответствуют условию "поле даты факса не равно дате паузы".Можно ли использовать ~ Q и F вместе, как это?

выполнил такой тест:

        deals = Deal.objects.all()
        balance_pre = Balance.objects.filter(~Q(fax_date=F('paused_date')), fax_date__isnull=False, reserved=False)
        agr_nums = list(deals.filter(agr_name__isnull=False).values_list('agr_name', flat=True).distinct())
        agrs_with_fax = 0

        for agr_num in agr_nums:
            try:
                balance_agr = Balance.objects.get(number__icontains=agr_num)
                if balance_agr.fax_date is not None and balance_agr.fax_date != balance_agr.paused_date and not balance_agr.reserved:
                    agrs_with_fax += 1
            except Balance.DoesNotExist:
                pass
        agrs_with_fax2 = 0

        for agr_num in agr_nums:
            try:
                balance_pre.get(number__icontains=agr_num)
                agrs_with_fax2 += 1
            except Balance.DoesNotExist:
                pass

        r = [agrs_with_fax, agrs_with_fax2, balance_agr.fax_date, balance_agr.paused_date, balance_agr.reserved]

r вернул

[55, 0, datetime.date(2018, 7, 11), None, False]

Я невидите мою ошибку, оба цикла должны возвращать один и тот же результат.

1 Ответ

0 голосов
/ 17 сентября 2018

Я создал модель Balance в новом проекте, просто чтобы проверить, что print (qs.query) покажет вам сгенерированный запрос (не во всех случаях) в этом случае.Я также использовал exclude, поскольку @ daniel-roseman предложил доказать, что они эквивалентны.Я надеюсь, что это поможет вам.

>>> from django.db.models import F, Q
>>> qs = Balance.objects.filter(~Q(fax_date=F('paused_date')))
>>> print(qs.query)
SELECT "so_balance"."id", "so_balance"."fax_date", "so_balance"."paused_date" 
FROM "so_balance" WHERE NOT ("so_balance"."fax_date" = 
("so_balance"."paused_date"))
>>> qs = Balance.objects.exclude(fax_date=F('paused_date'))
>>> print(qs.query)
SELECT "so_balance"."id", "so_balance"."fax_date", "so_balance"."paused_date" 
FROM "so_balance" WHERE NOT ("so_balance"."fax_date" = 
("so_balance"."paused_date"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...