自定义模型管理器的Django get_queryset方法对其他内置方法(get,filter等)没有影响

时间:2017-12-20 18:02:43

标签: python django django-models django-managers

我创建了一个模型管理器,其中的方法是在特定字段中添加一些字符串,我的目标是每次调用objects时应用此方法。据我了解,这可以通过在自定义管理器中使用get_queryset方法来实现,但这只有在我调用SomeModel.objects.all()时才有效。如果我尝试应用一些过滤器,或者通过参数获取对象,它只会返回原始数据而不应用我的方法。

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('...')


class BaseModel(models.Model):
    objects = BaseModelManager()

    class Meta:
        abstract = True

django shell中的输出:

>>> SomeModel.objects.all()[0].description
    'Some example of description...'
>>> SomeModel.objects.get(id=1).description
    'Some example of description'

人们,我做错了什么,请帮忙。非常感谢千倍!

1 个答案:

答案 0 :(得分:0)

model.objects.get方法不返回QuerySet,因此调用永远不会由get_queryset处理。 .get返回单个对象,而不是可迭代的对象。

因此,您希望覆盖模型管理器中的get方法,以专门处理.get的大小写。