Аннотации 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()))