Поля типа ManyToManyField не сохраняют данные при отправке запроса, DRF
В основном я делаю что-то вроде 'Archive of Our Own' и у меня не сохраняется работа или сохраняется, но данные полей ManyToMany не сохраняются
views.py
if request.method == 'POST':
serializer = FanficSerializerCreate(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({'fanfic': serializer.data}, status = status.HTTP_201_CREATED)
models.py
class Fanfic(models.Model):
...
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
fandoms = models.ManyToManyField(Fandom)
pairings = models.ManyToManyField(Pairing)
characters = models.ManyToManyField(Hero)
tags = models.ManyToManyField(Tag)
....
serializer.py
class FanficSerializerCreate(ModelSerializer):
fandoms = FandomSerializer(many=True, read_only=True)
pairings = PairingSerializer(many=True, read_only=True)
characters = HeroSerializer(many=True, read_only=True)
tags = TagSerializer(many=True, read_only=True)
class Meta:
model = Fanfic
fields = ['id', 'user', 'title', 'fandoms', 'pairings', 'characters', 'translate', 'categories', 'end', 'relationships', 'tags', 'description', 'note', 'i_write_for', 'created', 'updated']
Я думаю, что проблема в сериализаторе для другой секции, например, добавление символа с тем же кодом представления, но без полей manytomanyfield в моделях работает нормально
когда я пишу это в serializers.py
fandoms = FandomSerializer(many=True, read_only=True)
pairings = PairingSerializer(many=True, read_only=True)
characters = HeroSerializer(many=True, read_only=True)
tags = TagSerializer(many=True, read_only=True)
отображает
{
"fanfic": {
"id": 4,
"user": 3,
"title": "Claimed",
"fandoms": [],
"pairings": [],
"characters": [],
"translate": "NO",
"categories": "M",
"end": "ENDED",
"relationships": "M/M",
"tags": [],
"description": "",
"i_write_for": "...",
"created": "2022-11-14T13:46:44.425693Z",
"updated": "2022-11-14T13:46:44.425693Z"
}
}
id просто не добавлен в поля
когда я пишу это в serializers.py
fandoms = FandomSerializer(many=True)
pairings = PairingSerializer(many=True)
characters = HeroSerializer(many=True)
tags = TagSerializer(many=True)
в почтальоне
{
"message": {
"fandoms": [
"This field is required."
],
"pairings": [
"This field is required."
],
"characters": [
"This field is required."
],
"tags": [
"This field is required."
]
}
}
Вы можете сделать поля вложенных сериализаторов необязательными, если required=False
обратитесь к этому полю:
class FanficSerializerCreate(ModelSerializer):
fandoms = FandomSerializer(many=True, required=False)
...
class Meta:
model = Fanfic
...
Кроме того, вы можете иметь их для различных полей в классе Meta
:
class FanficSerializerCreate(ModelSerializer):
fandoms = FandomSerializer(many=True)
...
class Meta:
model = Fanfic
extra_kwargs = {
'fandoms': {'required': False}
...
}
...
Ссылка: (https://www.django-rest-framework.org/api-guide/fields/#required)