#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 — это еще не то, что я действительно грокнул. Хорошо, пришло время еще немного почитать. Большое спасибо за ответ.