django 什么时候应该使用to_representation?

ht4b089n  于 2023-04-07  发布在  Go
关注(0)|答案(1)|浏览(126)

我正在寻找指导,看看我对to_representation的使用是否是一种不错的方法,或者是否有更好的方法来解决我的特定问题。
我在我的www.example.com中有此代码serializers.py:

from rest_framework import serializers
from .models import Project, Task, TaskStatus

class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = ["name", "description", "start_date", "end_date", "pkid"]

    def create(self, validated_data):
        organization = validated_data.pop('organization', None)
        project = Project.objects.create(**validated_data)

        if organization:
            project.organization = organization
            project.save()

        return project

class TaskStatusSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ["name", "description", "pkid"]

    def create(self, validated_data):
        task_status = TaskStatus.objects.create(**validated_data)
        return task_status
class TaskSerializer(serializers.ModelSerializer):
    project = serializers.PrimaryKeyRelatedField(queryset=Project.objects.all())
    status = serializers.PrimaryKeyRelatedField(queryset=TaskStatus.objects.all())
    class Meta:
        model = Task
        fields = ["name", "description", "project","status","pkid"]

    def create(self, validated_data):
        project = validated_data.pop('project')
        status = validated_data.pop('status')
        
        task = Task.objects.create(project=project, status=status, **validated_data)

        task.save()
        return task
    
    def to_representation(self, instance):
        representation = super().to_representation(instance)
        representation['project'] = ProjectSerializer(instance.project).data
        representation['status'] = TaskStatusSerializer(instance.status).data
        return representation

我想做的是让我的TaskSerializer响应API请求,并提供我用来填充Vue列表的任务,任务状态和项目对象。在视图列表中,我有一个create modal,它加载用户可以通过下拉菜单选择项目并指定状态。这些返回到序列化器作为post,我使用project_id和status_id创建任务。
这里的to_representation用法使流程正常工作,但感觉不太标准。有没有更好更优雅的方法来处理我的用例?
上面的代码是工作,但我想知道是否有一个更好的标准Django的方法。

g6ll5ycj

g6ll5ycj1#

根据Docs,调用.to_representation()方法将初始数据类型转换为原始的可序列化数据类型。
因此,如果您想覆盖字段的表示或添加自定义字段,可以使用此方法。
您也可以使用**.SerializerMethodField()**作为只读字段:

class TaskSerializer(serializers.ModelSerializer):
   project = serializers.SerializerMethodField()

   class Meta:
        model = Task
        fields = ["somefields", "project"]
    
   def get_project(self, obj):
      return ProjectSerializer(obj.project).data

相关问题