首页 > 解决方案 > 如何从 django 模型正确获取数据到 Django REST 框架

问题描述

我正在使用 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)

但它不返回任何数据。Shell 控制台声明它获取查询集,获取字段,但似乎没有获取值:

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

提前感谢您的建议和帮助!

标签: jsondjangodjango-modelsdjango-rest-frameworkdjango-serializer

解决方案


您填充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)


推荐阅读