Аннотировать набор запросов с логическим значением, в котором одно поле равно или не равно другому полю - PullRequest
0 голосов
/ 10 июля 2020

Вопрос касается аннотации в Django.

Например, у меня есть следующая модель:

class Example(models.Model):

    field_1 = PositiveIntegerField()
    field_2 = PositiveIntegerField()

И я хочу аннотировать набор запросов на основе этой модели с помощью логического True или False в зависимости от того, удалось ли мне field_1 == field_2

найти 2 решения по этому поводу, оба из них меня не удовлетворяют.

  1. Example.objects.extra(select={'equal': r' field_1 = field_2'})

Используйте Raw SQL и extra(), которые скоро станут устаревшими.

2)

Example.objects.all()\
    .annotate(
    equal=
        Case(
            When(field_1=F('field_2'), then=True),
            default=False,
            output_field=BooleanField(),
        )
    )

Что довольно многословно и делает запрос в 4 раза медленнее .

Вопрос - возможно ли express такой лог c в Django ORM без использования RAW SQL и с менее подробным и более простым логом c?

Спасибо.

1 Ответ

0 голосов
/ 10 июля 2020

Нашел это здесь, в Stackowerflow.

annotate(
            equal=ExpressionWrapper(
                Q(field_1=F('field_2')),
                output_field=BooleanField()
            ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...