【问题标题】:Django REST API - serializer with different format for read and write?Django REST API - 具有不同读写格式的序列化程序?
【发布时间】:2020-08-17 15:39:14
【问题描述】:

我正在使用 DRF 来运行一些 AJAX 后端端点。我有这两个模型:

class Quiz(models.Model):
    title = models.CharField(max_length=50)

class Team(models.Model):
    name = models.CharField(max_length=50)
    quiz = models.ForeignKey('Quiz', on_delete=models.CASCADE, related_name='teams')

然后我使用 DRF 的泛型来创建一个基本的读/写端点:

class TeamList(generics.ListCreateAPIView):
    queryset = Team.objects.all()
    serializer_class = TeamSerializer

和一个模型序列化器

class TeamSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Team
        fields = ['id', 'name', 'quiz']

我可以POST 一些带有测验 ID 的 JSON 来创建团队:

{"quiz": 123, "name": "My Team Name"}

但我希望 GET 版本包含测验标题:

{"quiz": {"id": 123, "title": "My Quiz Title"}, "id": 234, "name": "My Team Name"}

最好的方法是什么?有两个序列化器并覆盖 ListCreateAPIView.list() 方法?

【问题讨论】:

    标签: django rest django-rest-framework


    【解决方案1】:

    我可能有两个序列化程序,但一个 ViewSet 的 get_serializer_class 被覆盖。

    class BaseTeamSerializer(serializers.ModelSerializer):
        class Meta:
            model = Team
            fields = ['id', 'name', 'quiz']
    
    class CreateTeamSerializer(BaseTeamSerializer):
        pass
    
    class TeamSerializer(BaseTeamSerializer):
        quiz = QuizSerializer(many=False)
    
    
    class TeamViewSet(mixins.CreateModelMixin,
                      mixins.RetrieveModelMixin,
                      mixins.ListModelMixin,
                      GenericViewSet):
        queryset = Team.objects.all()
        
        def get_serializer_class(self):
            if self.request.method == "POST":
                return CreateTeamSerializer # Or could use BaseTeamSerializer
            return TeamSerializer
    

    【讨论】:

    • 啊,视图集并不是我真正了解的东西。好的,是时候做更多的阅读了。非常感谢您的回复。
    猜你喜欢
    • 2018-11-06
    • 1970-01-01
    • 2020-04-28
    • 2020-01-03
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2013-08-21
    • 2019-05-25
    相关资源
    最近更新 更多