【问题标题】:Original exception text was: 'QuerySet' object has no attribute 'weight'原始异常文本是:“QuerySet”对象没有属性“权重”
【发布时间】:2019-03-07 10:24:24
【问题描述】:

我遇到了异常 在序列化程序 WeightHistorySerializer 上尝试获取字段 weight 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 QuerySet 实例上的任何属性或键都不匹配。 原始异常文本是:“QuerySet”对象没有属性“权重”。 当我尝试检索数据时。

models.py

class WeightHistory(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    weight = models.FloatField(null=False, blank=False)
    created_at = models.DateTimeField(auto_now_add=True)

序列化器.py

class WeightHistorySerializer(serializers. HyperlinkedModelSerializer):
    class Meta:        
        model = WeightHistory        
        fields = (
            'id', 
            'weight',
            'user_id',
            'created_at'
        )   
        read_only_fields = ('id',)

views.py

def weight_history_detail(request, user_id):
    # Retrieve, update or delete a weight_history/detail.
    try:
        weight_history = WeightHistory.objects.filter(user_id=user_id)
    except WeightHistory.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = WeightHistorySerializer(weight_history)
        return Response(serializer.data)

如果改为

weight_history = WeightHistory.objects.get(user_id=user_id)

它只返回一行,但我想要给定 user_id 的所有行。那么,我应该怎么做才能获取给定 user_id 的所有列表。

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:
    'QuerySet' object has no attribute 'weight'.
    

    是的。 QuerySet 是一个 Set,一个对象列表。

    <QuerySet [<Object1>, <Object2>,..]>
    

    并且该列表没有属性weight。相反,QuerySet 中的对象具有weight 属性。

    weight_history = WeightHistory.objects.filter(user_id=user_id)
    

    filter 返回一个QuerySet,一个WeightHistory 对象列表和user_id=user_id

    并且您正在尝试将列表序列化为单个对象。

    而不是这个:

    serializer = WeightHistorySerializer(weight_history)
    

    这样做:

    serializer = WeightHistorySerializer(weight_history, many=True)
    

    many=True 告诉序列化程序一个正在传递的对象列表进行序列化。

    此外,

    try:
       weight_history = WeightHistory.objects.filter(user_id=user_id)
    except WeightHistory.DoesNotExist:
       return Response(status=status.HTTP_404_NOT_FOUND)
    

    这根本不会引发异常。 filter 如果不存在对象,则返回一个空的 QuerySet。 &lt;QuerySet []&gt;

    所以最后的代码是:

    def weight_history_detail(request, user_id):
        # Retrieve, update or delete a weight_history/detail.
        weight_history = WeightHistory.objects.filter(user_id=user_id)
        if weight_history.count()<1:
            return Response(status=status.HTTP_404_NOT_FOUND)
    
        if request.method == 'GET':
            serializer = WeightHistorySerializer(weight_history, many=True)
            return Response(serializer.data)
    

    【讨论】:

    • 非常非常感谢兄弟。它帮助了我。保持联系我需要更多帮助。因为,我是 Django REST 框架的初学者
    • 我有一些问题。我怎样才能连接你?可以给我你的邮箱吗?
    【解决方案2】:

    views.py

    def weight_history_detail(request, user_id):
        # Retrieve, update or delete a weight_history/detail.
        try:
            weight_history = WeightHistory.objects.get(user_id=user_id) #get
            except WeightHistory.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
    
        if request.method == 'GET':
            serializer = WeightHistorySerializer(weight_history)
            return Response(serializer.data)
    

    使用get 而不是filter 它会解决你的错误

    【讨论】:

      猜你喜欢
      • 2020-08-25
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2021-06-12
      • 2021-06-18
      相关资源
      最近更新 更多