Python 为什么使用filter()可以得到我想要的,但使用get()会产生错误
我创建了cusom QuerySet和Manager来序列化我的数据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
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()
只是一个简单的对象。