Как правильно получить данные из модели django в среду Django REST

#json #django #django-models #django-rest-framework #django-serializer

#json #django #django-модели #django-rest-framework #django-сериализатор

Вопрос:

Я работаю с Python 3.9 и Django 3.1.6. У меня довольно длинная модель в models.py . Короткая версия выглядит примерно так:

 class Check (models.Model):
    @property
    def total_body_fat_percentage(self):
        if self.client_gender == "M":
            total_body_fat_percentage = (self.Yuhasz * 0.097)   3.64
            pass
        else:
            total_body_fat_percentage = total_body_fat_percentage = float((self.Yuhasz * 0.1429)   4.56)
        return total_body_fat_percentage

    @property
    def muscle_weight_percentage(self):
        muscle_weight_percentage =self.muscle_weight*100/self.weight
        return muscle_weight_percentage
 

Эти поля возвращают число с плавающей запятой. Что-то вроде 14.407.

Конечно, там есть и другие поля, такие как Yuhasz, client_gender и т.д. Мне нужны эти значения в JSON. Я попытался использовать следующий сериализатор на serializer.py:

 class PercentagesSerializer(ModelSerializer):

    class Meta:
        model = Check
        fields = ('total_body_fat_percentage', 'muscle_weight_percentage')
 

И у меня есть следующий класс на views.py:

 class PercentagesAPI(APIView):

    authentication_classes = []
    permission_classes = []

    serializer = PercentagesSerializer
    
    def get(self, request, format=None):
        lista = Check.objects.all()
        print(lista)
        response = self.serializer(lista)
        print(response)
        json_response= json.dumps(response.data)
        print(json_response)
        data = {
            'percentages': json_response
        }
        
        return Response(response.data)
 

Но он не возвращает никаких данных. Консоль оболочки заявляет, что она получает набор запросов, получает поля, но, похоже, не получает значения:

 <QuerySet [<Check: Check object (1)>]>
PercentagesSerializer(<QuerySet [<Check: Check object (1)>]>):
    total_body_fat_percentage = ReadOnlyField()
    muscle_weight_percentage = ReadOnlyField()
{}
 

Заранее благодарю вас за ваши советы и помощь!

Комментарии:

1. Вы заполняете data переменную, но никогда не используете ее.

2. @IvanStarostin Прошу прощения. Я в некотором роде любитель. Что вы подразумеваете под его использованием?

3. Есть ли изменения, которые вы намеревались вернуть в ответ {'percentages': json_response} ?

4. @IvanStarostin Я на самом деле следую структуре из charts.js (каким будет использование этих данных). Однако json_response это пустой массив.

Ответ №1:

Вы заполняете data переменную, но никогда не используете ее. Вместо этого вы возвращаете response.data

  response = self.serializer(lista)
 data = {
            'percentages': json_response
        }
        
 return Response(response.data)
 

Я считаю, что это решение:

  response = self.serializer(lista, many=True) # <-- many
 data = {
            'percentages': json_response
        }
        
 return Response(data) # <-- data
 

Запрос возвращает что-то — печать показывает 1 запись / объект: Check object (1)

Комментарии:

1. Он возвращает пустой массив: { "percentages": "{}" }

2. Большое вам спасибо!!!! Я провел всю ночь, выясняя это, и теперь это решено!