Django ORM аннотирует запрос
У меня есть подзапрос, который возвращает массив. Я хочу выполнить определенные операции, чтобы выбрать одни данные из этого массива. Я не могу понять, как это сделать
query_obj = MySecurity.objects.filter(
valid_data=True
).values(
"id",
"rate",
).annotate(
rating_val=Subquery(
MySecurity.object.order_by("-date_of_credit")
.values("credit_code")[:1]
),
)
)
Я хочу обработать мой rating_val, который будет массивом. Я пробовал передавать результат подзапроса в функцию типа:
annotate(
rating_val=myFun(Subquery(
MySecurity.object.order_by("-date_of_credit")
.values("credit_code")[:1]
)),
)
)
Но я не могу получить доступ к значению подзапроса.
Я также попробовал передать последующую часть подзапроса менеджеру модели, но снова не могу получить доступ к ответу подзапроса.
При использовании подзапроса вам нужно сообщить Django, как внутренний запрос связан с внешним, и Django предоставляет OuterRef
для помощи в фильтрации внутреннего запроса.
Приведенный ниже пример взят из Django's doc
newest = Comment.objects.filter(post=OuterRef('pk')).order_by('-created_at') Post.objects.annotate(newest_commenter_email=Subquery(newest.values('email')[:1]))
В вашем коде вы сделали подзапрос на self без указания условий фильтрации, что приводит к аннотированию одного и того же значения для каждой строки запроса. И трудно понять, как на самом деле вы хотите, чтобы подзапрос был связан с внешним запросом.