поле django m2m возвращает ключи вместо ключей - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть модель:

class Scenario(models.Model):
    tasks = models.ManyToManyField(Task, blank=True)

Его сериализатор:

class ScenarioSerializer(serializers.ModelSerializer):

    class Meta:
        model = Scenario
        fields = '__all__'

И вид для извлечения и публикации сценариев:

@api_view(['GET', 'POST'])
def scenarios_list(request):

    scenarios = []

    """
    List all scenarios, or create a new.
    """
    if request.method == 'GET':
        # get projects of a specific stakeholder
        if request.query_params.get('stakeholderId'):
            stakeholderId = request.query_params.get('stakeholderId')
            scenarios = Scenario.objects.filter(stakeholder=stakeholderId)
            serializer = ScenarioSerializer(scenarios, many=True)
            return Response(serializer.data)
        else:
            scenarios = Scenario.objects.all()
            serializer = ScenarioSerializer(scenarios, many=True)
            return Response(serializer.data)

    elif request.method == 'POST':
        serializer = ScenarioSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(stakeholder=request.user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(
                serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Это дает мне следующие данные:

[{"id":1,"tasks":[1,3]},{"id":2,"tasks":[2,4,5,10]},{"id":3,"tasks":[2,5,6]},{"id":4,"tasks":[2,6,10]}]

Я хочу получать объекты задач вместо их идентификаторов. Как я могу этого достичь?

1 Ответ

0 голосов
/ 25 апреля 2018

Вам нужно TaskSerializer, а затем скажите ScenarioSerializer, что он должен использовать вложенный сериализатор для представления задач.Что-то вроде следующего:

class ScenarioSerializer(serializers.ModelSerializer):
    tasks = TaskSerializer(many=True, read_only=True)
    class Meta:
        model = Scenario
        fields = '__all__'

Примечание к данным POST: Вложенный сериализатор использует совершенно другой шаблон, чем стандартное отношение на основе pk.Это особенно верно при записи данных.Например, неясно, должна ли вложенная запись использовать get_or_create или просто create для связанных объектов.По умолчанию сериализаторы DRF не обрабатывают вложенные записи.Проверьте документы для получения подробной информации о вложенных отношениях, в том числе о том, как обращаться с записываемым вложенным сериализатором.

...