原始异常文本是:'QuerySet' 对象没有属性 'weight'

ami*_*it 5 django-rest-framework

尝试获取weightserializer 上的字段值时WeightHistorySerializerQuerySet出现异常 Got AttributeError 序列化器字段可能命名不正确,并且与实例上的任何属性或键都不匹配原始异常文本是:'QuerySet' 对象没有属性 'weight'。 当我尝试检索数据时。

模型.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)
Run Code Online (Sandbox Code Playgroud)

序列化程序.py

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

视图.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)
Run Code Online (Sandbox Code Playgroud)

如果改为

weight_history = WeightHistory.objects.get(user_id=user_id)
Run Code Online (Sandbox Code Playgroud)

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

whi*_*hat 11

'QuerySet' object has no attribute 'weight'.
Run Code Online (Sandbox Code Playgroud)

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

<QuerySet [<Object1>, <Object2>,..]>
Run Code Online (Sandbox Code Playgroud)

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

weight_history = WeightHistory.objects.filter(user_id=user_id)
Run Code Online (Sandbox Code Playgroud)

filter返回 a QuerySet,带有 的WeightHistory对象列表user_id=user_id

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

取而代之的是:

serializer = WeightHistorySerializer(weight_history)
Run Code Online (Sandbox Code Playgroud)

做这个:

serializer = WeightHistorySerializer(weight_history, many=True)
Run Code Online (Sandbox Code Playgroud)

many=True 告诉序列化器正在传递对象列表以进行序列化。

而且,

try:
   weight_history = WeightHistory.objects.filter(user_id=user_id)
except WeightHistory.DoesNotExist:
   return Response(status=status.HTTP_404_NOT_FOUND)
Run Code Online (Sandbox Code Playgroud)

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

所以最终的代码是:

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)
Run Code Online (Sandbox Code Playgroud)