Аннотации Django из разных источников

Я пытаюсь построить следующую аннотацию, по сути, ищу поле nin у человека либо из IDcard, либо из Person модели.

.annotate(
       checkins_scan=Scan.objects.filter(models.Q(nin=OuterRef("person__idcard__nin") | models.Q(national_number=OuterRef("person__nin")))
       .values(
           data=JSONObject(id="id", nin="nin", datetime="datetime")
       )[:1]
)

Однако я получаю следующую ошибку:

NotImplementedError: Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations.

Похоже, что мне понадобится bitor(), но я не могу продвинуться дальше с основными примерами, которые я нахожу (например, документация здесь).

Когда я пытаюсь работать с F(), я получаю TypeError: F.__init__() got an unexpected keyword argument 'nin'.

Есть ли подсказки, как правильно это сделать?

Вам необходимо использовать Subquery [Django-doc], а скобки совпали не полностью.:

from django.db.models import OuterRef, Subquery

MyModel.objects.annotate(
    checkins_scan=Subquery(
        Scan.objects.filter(
            models.Q(nin=OuterRef('person__idcard__nin'))
            | models.Q(national_number=OuterRef('person__nin')).values(
                data=JSONObject(id='id', nin='nin', datetime='datetime')
            )
        )[:1]
    )
)

Оператор | нельзя использовать в определенных контекстах ORM, таких как OuterRef и Subquery. Вместо этого вы должны использовать Q().bitor(Q()) для достижения того же эффекта.

checkins_scan = (
    Scan.objects.filter(
        Q(nin=OuterRef("person__idcard__nin")).bitor(Q(national_number=OuterRef("person__nin")))
    ).values(id="id", nin="nin", datetime="datetime")[:1]
)

.annotate(checkins_scan=Subquery(checkins_scan, output_field=JSONObject()))
Вернуться на верх