Django prefetch, связанный с int PK?
У меня есть модель "A", которая имеет:
class A:
my_fk = models.IntegerField(...)
Затем делаем такой запрос:
queryset = A.prefetch_queryset().prefetch_related("somemodel")
что все работает.
Теперь я хочу получить префетч из таблицы B, где B.id = A.my_fk. my_fk - это не сама модель, а просто внешний ключ int к ней.
Возможно ли это? Не хочу менять тип my_fk...
Насколько я понимаю, вы ищете метод, выполняющий предварительную выборку на B
, используя целые числа (которые функционируют как внешние ключи), хранящиеся в A
. Но, насколько я знаю, даже объект Prefetch
, который позволил бы сделать что-то вроде:
from django.db.models import Prefetch
result = C.objects.all().prefetch_related(
Prefetch(
"b_set",
queryset=B.objects.filter(pk__in= ... do some subquery with A),
to_attr="bees_and_ayes"
)
)
не работает, так как Prefetch
требует обратного набора (b_set
здесь).
Мы предполагаем, что существует модель C
, для которой вы хотите сделать предварительную выборку на B
, используя ключи из A
, но у вас нет отношения
Вместо этого можно создать новое отношение, используя annotate()
( См. документацию) в сочетании с подзапросом ( См. дополнительную документацию). Без разработки надлежащего рабочего кода решение может выглядеть следующим образом:
from django.db.models import OuterRef, Subquery
B.objects.annotate(
a_artificial_set=Subquery(
A.objects.filter(my_fk=OuterRef('id'))
)
)
Поскольку django позволяет вложенные подзапросы, вы должны быть в состоянии поместить это в другой запрос C.objects.annotate()
с другим SubQuery
, используя OuterRef
из C
так, чтобы вышеуказанный запрос действовал как ваш окончательный prefetch.