我一直在尝试让用户拥有最高级别但没有成功。 这是我的用户模型:
class User(models.Model):
email=models.EmailField(unique=True, null=False)
name=models.TextField(null=True)
它的序列化器:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'email', 'name')
观点:
class GetHighestValue(generics.ListAPIView):
serializer_class = UserSerializer
def get_queryset(self):
return User.objects.aggregate(Max('id'))
尝试获取字段
UserSerializer
。序列化程序字段可能已命名 错误且不匹配str
实例上的任何属性或键。 原始异常文本是:'str'对象没有属性'email'。
回溯:
追踪(最近的呼叫最后):
文件 “/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py” 第149行,在get_response中 response = self.process_exception_by_middleware(e,request)File“/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py”, 第147行,在get_response中 response = wrapped_callback(request,* callback_args,** callback_kwargs)
文件“/usr/local/lib/python2.7/dist-packages/django/views/decorators/csrf.py”, 第58行,在wrapped_view中 return view_func(* args,** kwargs)
文件“/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py”, 第68行,在视野中 return self.dispatch(request,* args,** kwargs)
文件“/home/user/.local/lib/python2.7/site-packages/rest_framework/views.py”, 第466行,在派遣中 response = self.handle_exception(exc)
文件“/home/user/.local/lib/python2.7/site-packages/rest_framework/views.py”, 第463行,在发送中 response = handler(request,* args,** kwargs)
文件“/home/user/.local/lib/python2.7/site-packages/rest_framework/generics.py”, 第201行,在获得 return self.list(request,* args,** kwargs)
文件“/home/user/.local/lib/python2.7/site-packages/rest_framework/mixins.py”, 第48行,在列表中 return Response(serializer.data)
文件“/home/user/.local/lib/python2.7/site-packages/rest_framework/serializers.py”, 第674行,数据 ret = super(ListSerializer,self).data
文件“/home/user/.local/lib/python2.7/site-packages/rest_framework/serializers.py”, 第239行,数据 self._data = self.to_representation(self.instance)
文件“/home/user/.local/lib/python2.7/site-packages/rest_framework/serializers.py”, 第614行,在to_representation中 self.child.to_representation(item)for iterable中的项目
文件“/home/user/.local/lib/python2.7/site-packages/rest_framework/serializers.py”, 第463行,在to_representation中 attribute = field.get_attribute(instance)
文件“/home/user/.local/lib/python2.7/site-packages/rest_framework/fields.py”, 第422行,在get_attribute中 raise type(exc)(msg)AttributeError:尝试在序列化程序上获取字段UserSerializer
。序列化程序字段可能名称不正确 不匹配str
实例上的任何属性或键。原版的 异常文本是:'str'对象没有属性'email'。
答案 0 :(得分:2)
问题出在这里
def get_queryset(self):
return User.objects.aggregate(Max('id'))
预期的返回值是一个查询集。但聚合不返回查询集。使用User.objects.get()也不返回查询集。返回查询集的唯一方法是使用all()
或filter()
def get_queryset(self):
return User.objects.order_by(-'id')[0:1]
这里隐含了all(),[0:1]确保您返回一个可迭代的而不是一个对象。
答案 1 :(得分:1)
问题出在你看来,
当您尝试获取查询集时,您使用的是aggregate()
方法。
但是aggregate()
不返回查询集,而是返回名称 - 值对的字典。
有关详细信息,请参阅https://docs.djangoproject.com/en/1.9/topics/db/aggregation
与aggregate()
不同,annotate()
不是终止子句。 annotate()
子句的输出是QuerySet;可以使用任何其他QuerySet操作修改此QuerySet,包括filter()
,order_by()
。
希望有所帮助。
答案 2 :(得分:1)
我正在扩展zhaochy所写的内容。尝试将视图的get_queryset()
方法更改为以下内容。我们使用该数字来查找与max id关联的实例并返回该实例(这是一个查询集),而不是返回聚合的结果(不是查询集,因为它已经被评估过)。
class GetHighestValue(generics.ListAPIView):
serializer_class = UserSerializer
def get_queryset(self):
max_id = User.objects.aggregate(Max('id')).get('id__max')
return User.objects.filter(id=max_id)
免责声明:我在手机上写了这篇文章,我无法测试。请在评论中告诉我这是否解决了您的问题,我会根据需要进行编辑。