Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么使用filter()可以得到我想要的,但使用get()会产生错误_Python_Django_Model_Django Queryset_Attributeerror - Fatal编程技术网

Python 为什么使用filter()可以得到我想要的,但使用get()会产生错误

Python 为什么使用filter()可以得到我想要的,但使用get()会产生错误,python,django,model,django-queryset,attributeerror,Python,Django,Model,Django Queryset,Attributeerror,我创建了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.m

我创建了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()
json_data = Update.objects.get(id=1).serialize()
但引发AttributeError('Update'对象没有属性'serialize'),如下所示:

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

您还需要将
序列化
添加到
更新管理器

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
模型对象,因此不是
QuerySet
,默认情况下,模型不提供
.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)
class SerializableQuerySet(models.QuerySet):
def序列化(自):
返回序列化('json',self)
类序列化管理器(models.Manager):
_queryset_class=SerializableQuerySet
def序列化(self、*args、**kwargs):
返回self.get_queryset().serialize(*args,**kwargs)
类SerializableModel(models.Model):
对象=SerializableManager()
def序列化(自):
返回序列化('json',[self])
类元:
抽象=真
类更新(SerializableModel):
user=models.ForeignKey(settings.AUTH\u user\u MODEL,on\u delete=models.CASCADE)

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

因为
.filter
返回
查询集
,而
get
返回
对象
。serialize
UpdateQuerySet
对象上的函数,
filter()
返回这样的
查询集
,而
get()
只是一个简单的对象。