为什么使用 filter() 给出了我想要的,但是使用 get() 会引发错误

Why using filter() gives what I want, but with get() raises an error

我创建了自定义查询集和管理器来序列化我的数据。

class UpdateQuerySet(models.QuerySet):
    def serialize(self):
        return serialize("json", self)

class UpdateManager(models.Manager):
    def get_queryset(self):
        return UpdateQuerySet(self.model, using=self._db)

class Update(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    objects = UpdateManager()

然后,当我尝试获取这些数据时,它使用了这个:

json_data = Update.objects.filter(id=1).serialize()

但引发 AttributeError('Update' 对象没有属性 'serialize'):

json_data = Update.objects.get(id=1).serialize()

您还想将 serialize 添加到 UpdateManager

class UpdateManager(models.Manager):
    def get_queryset(self):
        return UpdateQuerySet(self.model, using=self._db)

    def serialize(self):
        return self.get_queryset().serialize()

您的 Update.objects.filter(id=1) return 是 UpdateQueryset,而 QuerySet 提供了 .serialize(…) 方法。 .get(id=1) 函数将 return 一个 Update 模型 对象 ,所以不是 QuerySet,默认情况下模型会 [=31] =]不提供.serialize(…)方法。

但是您可以自己实现它,甚至可以将 QuerySet 概括为适用于各种模型,例如:

class SerializableQuerySet(models.QuerySet):
    def serialize(self):
        return serialize('json', self)

class SerializableManager(models.Manager):
    <b>_queryset_class = SerializableQuerySet</b>

    def serialize(self, *args, **kwargs):
        return self.get_queryset().serialize(*args, **kwargs)

class SerializableModel(models.Model):
    objects = SerializableManager()
    
    def <b>serialize</b>(self):
        return serialize('json', <b>[self]</b>)

    class Meta:
        <b>abstract = True</b>

class Update(<b>SerializableModel</b>):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

所以现在所有继承自 SerializableModel 的模型,例如 Update 现在都将使用 SerializableManager,并且还将继承 .serialize() 方法,这样例如,您也可以使用 Update.objects.get(pk=1).serialize()