Поле ManyToMany django не работает, не принимает никаких данных в POST запросе?

У меня есть 2 модели - модуль и комната. Модуль может иметь ноль или несколько комнат, а комната может быть добавлена в несколько модулей. Таким образом, между ними существует простое отношение "многие ко многим". Но когда я определяю это в файле module/models.py, он не принимает никаких входных данных в виде 'rooms'. вот мои файлы -

module/model.py -

class Module(models.Model):
module_id = models.AutoField(primary_key=True)
title = models.CharField(max_length=100)
desc = models.TextField()
rooms = models.ManyToManyField(Rooms)

rooms/model.py -

class Rooms(models.Model):
room_id = models.AutoField(primary_key=True)
title = models.CharField(max_length=100)
desc = models.TextField()
level = models.CharField(max_length=100)
is_deleted = models.BooleanField(default=False)

module/serializers.py -

class ModuleSerializer(serializers.ModelSerializer):
rooms = RoomSerializer(read_only=True, many=True)
class Meta:
    model = Module
    fields = "__all__"

module/views.py -

class add_module(APIView):
def post(self, request, format=None):
    module_serializer = ModuleSerializer(data=request.data)
    if module_serializer.is_valid():
        module_serializer.save()
        return Response(module_serializer.data['module_id'], status = status.HTTP_201_CREATED)
    return Response(module_serializer.errors, status = status.HTTP_400_BAD_REQUEST)

Тело запроса POST для создания модуля в POSTMAN -

{
    "rooms": [
        {
            "room_id": 2,
            "title": "4",
            "desc": "22",
            "level": "2",
        }
    ],
    "title": "4",
    "desc": "22",
}

С помощью этого запроса создается модуль, но в него не добавляется комната.

Может ли кто-нибудь сказать мне, почему мои комнаты не добавляются при создании модулей?

Вам необходимо написать явный метод создания сериализатора для поддержки записываемых вложенных представлений.

https://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations

Пример:

class ModuleSerializer(serializers.ModelSerializer):
    rooms = RoomSerializer(many=True) # remove *read_only=True*

    class Meta:
        model = Module
        fields = "__all__"

    def create(self, validated_data):
        rooms_data = validated_data.pop('rooms')
        module = Module.objects.create(**validated_data)
        for data in rooms_data:
            room, created = Rooms.objects.get_or_create(**data)
            module.rooms.add(room)
        return module
Вернуться на верх