как установить значение для внешнего ключа, поданного перед выполнением создания в среде django rest

#django #django-rest-framework

Вопрос:

У меня есть два таких сериализатора :

 class MeetingLocationSerializer(serializers.ModelSerializer):

    class Meta:
        model = MeetingLocation
        fields = '__all__'

class MeetingtSerializer(serializers.ModelSerializer):

    location = MeetingLocationSerializer()
    photos = MeetingPhotoSerializer(many = True)
    class Meta:
        model = Meeting
        fields = ['id','title','description','date_time','time_zone','host','is_private','is_virtual','url','photos','location']
 

и это мой modelviewsets

 class MeetingListViewSet(viewsets.ModelViewSet):
       
    queryset = Meeting.objects.all()
    serializer_class = MeetingtSerializer
    
    
    
class MeetingPhotoViewSet(viewsets.ModelViewSet):
       
    queryset = MeetingPhoto.objects.all()
    serializer_class = MeetingPhotoSerializer
        
    def retrieve(self, request, *args, **kwargs):
        param = kwargs
        photos = MeetingPhoto.objects.filter(meeting=param['pk'])
        serializer = MeetingPhotoSerializer(photos, many =True)
    
        return Response(serializer.data)
 

когда я хочу опубликовать данные в MeetingListViewSet и сохранить их , для собрания, поданного в сериализаторе вложенных местоположений, требуется значение, которое является собранием, которое я пытаюсь создать, но оно еще не создано! что мне делать?

Ответ №1:

Таким образом, вы можете просто установить требуемое значение False, и если вы хотите создать вложенный список мест проведения собраний, вы можете просто создать функцию создания и определить, как я это сделал.

  class MeetingtSerializer(serializers.ModelSerializer):

    location = MeetingLocationSerializer(many=True,required=False,source="meetinglocation_set")
    photos = MeetingPhotoSerializer(many = True)
    class Meta:
        model = Meeting
        fields = ['id','title','description','date_time','time_zone','host','is_private','is_virtual','url','photos','location']

 def create(self, validated_data):

        if 'meetinglocation_set' in validated_data:
            cds = validated_data.pop('meetinglocation_set')
        else:
            cds = []

        instance = super().create(validated_data)
       
        for cd in cds:
            instance.meetinglocation_set.create(**cd)

        return instance