Я вложил в подкласс QuerySet
, чтобы предоставить ему дополнительный метод, который аннотирует QuerySet
из MyModel
настраиваемым полем (содержащим последнее связанное Person
, для целей оптимизации):
class MyModelQuerySet(models.QuerySet):
def with_last_person(self):
people = Person.objects.filter(user_id=OuterRef('id'))
people = people.annotate(person=RowToJson(F('id'), output_field=JSONField()))
return self.annotate(person=Subquery(people.values('person')[:1]))
Это прекрасно работает (например, [model.person for model in MyModel.objects.with_last_person()]
)
Однако сейчас я получаю другую модель , которая имеет отношение внешнего ключа к MyModel
:
other_model = OtherModel.objects.get(foo=bar) #...
Понятно, что поле other_model.my_model
содержит неотмеченный экземпляр MyModel
.
. Есть ли способ использовать этот спецификатор c QuerySet
для поиска связанных MyModel
с OtherModel
? Что-то вроде:
OtherModel.objects.filter(foo=bar).select_related('my_model', use_queryset=MyModelQuerySet)
Полагаю, я мог бы просто скопировать и вставить код из MyModelQuerySet.with_last_person
в запрос OtherModel
, но это излишне дублирует код. Есть ли другое решение, которое мне не хватает?