Я использую PrimaryKeyRelatedField для извлечения и записи данных M2M.
Мои модели.py:
class Task(MP_Node):
...
linked_messages = models.ManyToManyField('workdesk.Message', blank=True, related_name='supported_tasks')
(MP_Node
— это абстракция моделей.Модель из django-treebeard
).
Мои сериализаторы.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']
Мой апи.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': []}