#django-rest-framework
#django-rest-framework
Вопрос:
Я получил исключение Got AttributeError при попытке получить значение для поля weight
в сериализаторе WeightHistorySerializer
. Поле сериализатора может быть названо неправильно и не соответствовать какому-либо атрибуту или ключу в QuerySet
экземпляре. Исходный текст исключения был: объект ‘QuerySet’ не имеет атрибута ‘weight’. Когда я попытался восстановить данные.
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)
serializers.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)
Он возвращает только одну строку, но я хочу, чтобы все строки были с заданным идентификатором пользователя. Итак, что мне следует сделать, чтобы получить весь список с заданным идентификатором пользователя.
Ответ №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 []>
.
Итак, окончательный код:
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)
Комментарии:
1. Очень, очень спасибо тебе, братан. Это помогло мне. Оставайтесь на связи, мне нужна дополнительная помощь. Поскольку я новичок в Django rest framework
2. У меня возникла некоторая проблема. Как я могу вас подключить? можете ли вы дать мне свой адрес электронной почты?
Ответ №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
этого решит вашу ошибку