aggregate(Max('id'))返回异常'str'对象没有属性'email'

时间:2016-05-26 00:07:37

标签: python django django-models django-rest-framework

我一直在尝试让用户拥有最高级别但没有成功。 这是我的用户模型:

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'))
  

尝试获取字段email的值时出现AttributeError   序列化器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:尝试在序列化程序上获取字段email的值时获得AttributeError   UserSerializer。序列化程序字段可能名称不正确   不匹配str实例上的任何属性或键。原版的   异常文本是:'str'对象没有属性'email'。

3 个答案:

答案 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)

免责声明:我在手机上写了这篇文章,我无法测试。请在评论中告诉我这是否解决了您的问题,我会根据需要进行编辑。