django сериализация с вложенным объектом - PullRequest
0 голосов
/ 10 апреля 2020

Мне очень трудно понять, как работает django сериализатор. У меня есть функция api_view, отвечающая за создание объекта BGES с вложенным объектом Laboratoire, так что:

@api_view(['POST'])
def add_bges(request):    
    laboratoire_data = request.data.pop('laboratoire')
    laboratoire_serializer = LaboratoiresSerializer(data=laboratoire_data)
    if laboratoire_serializer.is_valid():
        laboratoire_serializer.save()
        request.data["laboratoire"] = laboratoire_serializer.data["id"]
        bges_serializer = BGESSerializer(data=request.data)
        if bges_serializer.is_valid():
            bges_serializer.save()
            return Response(bges_serializer.data, status=status.HTTP_201_CREATED)
        return Response(bges_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    return Response(laboratoire_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Мой BGESSerializer выглядит следующим образом

class BGESSerializer(serializers.ModelSerializer):
    class Meta:
        model = BGES
        fields = '__all__'

Таким образом, возвращаемый объект делает не содержит объект Laboratoire, поэтому я изменяю его на

class BGESSerializer(serializers.ModelSerializer):
    laboratoire = LaboratoiresSerializer(read_only=True)
    class Meta:
        model = BGES
        fields = '__all__'

Но так, когда я устанавливаю переменную laboratoire с идентификатором в api_view, как это

request.data["laboratoire"] = laboratoire_serializer.data["id"]

, он больше не работает , Я понимаю, django теперь ожидает объект, добавив:

laboratoire = Laboratoire.objects.get(pk=laboratoire_serializer.data["id"])
laboratoire_serializer2 = laboratoire_serializer(laboratoire)
request.data["laboratoire"] = laboratoire_serializer2.data

Но все еще не работает, поле laboratoire в окончательном ответе - None, что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...