Django create() не применяет аннотации, примененные к менеджеру

Представьте себе следующую модель, менеджер и набор запросов:

from django.db import models

class BlaQuerySet(models.QuerySet):
    def annotate_field(self):
        return self.annotate(bla_field=Value('Bla')

class BlaManager(models.Manager):
    def get_queryset(self):
        return BlaQuerySet(self.model, using=self._db).annotate_field()

class Bla(models.Model):
    hello = models.CharField(max_length=10)
    objects = BlaManager()

Теперь у нас есть модель. Давайте создадим что-нибудь:

bla_instance = Bla.objects.create(hello='something')
bla_instance.bla_field

возвращается

`AttributeError: у объекта 'Bla' нет атрибута 'bla_field'

С другой стороны, когда вы фильтруете этот элемент:

bla_instance = Bla.objects.get(hello='something')
bla_instance.bla_field

возвращает ожидаемое Bla

Использование настройки: Meta.base_manager_name = 'objects' не помогает.

Как заставить create() использовать мой менеджер вместо менеджера по умолчанию?

Вы можете переопределить create метод QuerySet:

class BlaQuerySet(models.QuerySet):
    def annotate_field(self):
        return self.annotate(bla_field=models.Value('Bla'))

    def create(self, **kwargs):
        obj = super().create(**kwargs)
        return self.get(pk=obj.pk)

Примечание: Учтите, что при этом выполняется еще один запрос к базе данных.

Но я предлагаю вам использовать свойство в этом случае:

class Bla(models.Model):
    hello = models.CharField(max_length=10)

    @property
    def bla_field(self):
        return 'Bla'

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