Невозможно использовать сериализатор, когда поле ManyToManyField пустое

Я использую PrimaryKeyRelatedField для получения и записи данных M2M.

Мой models.py:

class Task(MP_Node):
    ...
    linked_messages = models.ManyToManyField('workdesk.Message', blank=True, related_name='supported_tasks')

(MP_Node является абстракцией models.Model из django-treebeard).

Мой serializers.py:

class TaskSerializer(serializers.ModelSerializer):
    ...
    linked_messages = serializers.PrimaryKeyRelatedField(many=True, required=False, allow_null=True, queryset=Message.objects.all())

    class Meta:
        model = Task
        fields = [..., 'linked_messages']

Мой api.py:

class TaskViewSet(ModelViewSet):
    queryset = Task.objects.all()
    serializer_class = TaskSerializer

def create(self, request):
    serializer = self.get_serializer(data=request.data)
    if serializer.is_valid(raise_exception=True):
        print(serializer.data)

С другими полями, если поле установлено в null=True в моделях или required=False на сериализаторе, мне не нужно включать их в данные для инстанцирования сериализатора. Однако, похоже, что эти поля не работают таким образом, вместо этого возвращая KeyError: 'linked_messages' при вызове serializer.data.

В качестве обходного пути я попробовал добавить параметр allow_null, как указано в документации, а затем вручную скормить ему нулевое значение:

request.data['linked_messages'] = None

но это возвращается как 404:

"linked_messages":["This field may not be null."]

Если я установлю его на пустую строку:

"resources":["Expected a list of items but got type \"str\"."]

Если я устанавливаю его в пустой список, serializer.data снова выдает ошибку:

`TypeError: unhashable type: 'list'`

Кажется, что я могу повернуться в любую сторону. Что я не понимаю в этой области?

Использовать default аргумент -

linked_messages = serializers.PrimaryKeyRelatedField(
    many=True,
    queryset=Message.objects.all(),
    default=[]
)

# print(serializer.data)
# {'linked_messages': []}
Вернуться на верх