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)
| 归档时间: |
|
| 查看次数: |
5111 次 |
| 最近记录: |