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.

Вернуться на верх