I have created a custom Manager
, but in my case its method adds some string to the end of particular field in a model instead of just filtering queryset as in usual cases.
My goal is to return already changed objects when calling SomeModel.objects
. Django`s documentation says:
You can override a Manager’s base QuerySet by overriding the Manager.get_queryset() method. get_queryset() should return a QuerySet with the properties you require.
My approach works, when I call SomeModel.objects.all()
, but if I apply some filter for objects
or just after .all()
I can see that data become just regular.
models.py:
class BaseModelQuerySet(models.QuerySet):
def edit_desc(self, string):
if self.exists():
for obj in self:
if 'description' in obj.__dict__:
obj.__dict__['description'] += string
return self
class BaseModelManager(models.Manager):
def get_queryset(self):
return BaseModelQuerySet(self.model, using=self._db).edit_desc('...extra text')
class BaseModel(models.Model):
objects = BaseModelManager()
class Meta:
abstract = True
Shell output:
>>> Macro.objects.all()[0].description
'Test text...extra text'
>>> Macro.objects.all().filter(id=1)[0].description
'Test text'
That makes me confused. Such impression that other methods calling regular queryset instead of one returned with custom objects
.