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'