Исходный текст исключения был: объект ‘QuerySet’ не имеет атрибута ‘weight’

#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 этого решит вашу ошибку