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

问题描述

我创建了cusom QuerySet和Manager来序列化我的数据。

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)返回一个UpdateQueryset,并且该QuerySet提供了一种.serialize(…)方法。 .get(id=1)函数将返回Update模型 object ,而不是QuerySet,并且默认情况下,模型 not 不提供.serialize(…)方法。

不过,您可以自己实现,甚至可以推广QuerySet以使用各种模型,例如:

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

class SerializableManager(models.Manager):
    _queryset_class = SerializableQuerySet

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

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

    class Meta:
        abstract = True

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

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