Django: Как использовать аннотацию из родительского кверисета?

У меня есть класс Item, который может быть аннотирован с помощью пользовательского метода queryset add_is_favorite_for:

class ItemQuerySet(QuerySet):
    def add_is_favorite_for(self, user):
        """add a boolean to know if the item is favorited by the given user"""
        condition = Q(id__in=Item.objects.filter(favoriters=user).values("id"))
        return self.annotate(is_favorite=Condition(condition)) # True or False

class Item(Model):
    objects = Manager.from_queryset(ItemQuerySet)()

Работает так, как ожидалось. Например:

>>> user = User.objects.get(id=1)
>>> Item.objects.add_is_favorite_for(user) # each item has now a `is_favorite` field

Затем я добавил модель Factory и связал с ней модель Item с помощью отношения 1->N:

class Factory(Model):
    pass  # ...

class Item(Model):
    objects = Manager.from_queryset(ItemQuerySet)()
    advised_in = models.ForeignKey(
        Factory,
        on_delete=models.CASCADE,
        related_name="advised_items",
    )

Теперь я хотел бы иметь возможность возвращать Factory QuerySet, все поля которого advised_items будут содержать аннотацию is_favorite. Я не знаю, как это сделать, я не видел примера такой вещи в документации, может быть, я пропустил его.

Вы можете работать с Prefetch объектом [Django-doc]:

from django.db.models import Prefetch

Factory.objects.prefetch_related(
    Prefetch('advised_items', queryset=Item.objects.add_is_favorite_for(some_user))
)
Вернуться на верх