Невозможно использовать сериализатор, когда поле 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': []}