Django REST API — сериализатор с другим форматом для чтения и записи?

#djan&o #rest #djan&o-rest-framework

#djan&o #rest #djan&o-rest-framework

Вопрос:

Я использую DRF для запуска некоторых конечных точек AJAX-сервера. У меня есть эти две модели:

 class Quiz(models.Model):
    title = models.CharField(max_len&th=50)

class Team(models.Model):
    name = models.CharField(max_len&th=50)
    quiz = models.Forei&nKey('Quiz', on_delete=models.CASCADE, related_name='teams')
  

Затем я использую общие компоненты DRF для создания базовой конечной точки чтения / записи:

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

и сериализатор моделей

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

Я могу POST использовать некоторый JSON с идентификатором викторины для создания команды:

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

Но я бы хотел, чтобы GET версия включала название теста:

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

Каков наилучший способ сделать это? Иметь два сериализатора и переопределять метод ListCreateAPIView.list()?

Ответ №1:

У меня, вероятно, было бы два сериализатора, но один ViewSet, где &et_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 &et_serializer_class(self):
        if self.request.method == "POST":
            return CreateTeamSerializer # Or could use BaseTeamSerializer
        return TeamSerializer
  

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

1. Ах, viewsets — это еще не то, что я действительно грокнул. Хорошо, пришло время еще немного почитать. Большое спасибо за ответ.