Почему аннотирование дублирует мои объекты набора запросов? - PullRequest
1 голос
/ 25 марта 2020

Всякий раз, когда я использую Annotate с Case / When logi c, чтобы вернуть логическое значение, результирующий набор запросов становится почти вдвое длиннее.

Модель:

class Message(models.Model):
    readers = models.ManyToManyField(Compte, related_name='messages')

Message.objects.count() // return 495

Затем:

qs = Message.objects.annotate(read=Case(
         When(readers=Compte.objects.first(), then=Value(True),
         default=Value(False),
         outputfield=BooleanField()))

qs.count() // return 940

Что мне здесь не хватает? Django 2.2,9 / PostgreSQL

1 Ответ

1 голос
/ 25 марта 2020

Причина, по которой это не удается, состоит в том, что он создает JOIN с таблицей соединений , а затем комментирует каждую комбинацию с помощью True или False.

. используйте Exists здесь:

from django.db.models import Exists, OuterRef

compte_first = Compte.objects.first()

subquery = Message.readers.model.filter(
    message_id=OuterRef('pk'),
    compte_id=compte_first.pk
)

Message.objects.annotate(read=<b>Exists(subquery)</b>)
...