DRF - Вложенный сериализатор, записывающий данные
Это модель
class Memo(BaseModel):
memo_text = models.TextField(null=True, blank=True)
tag = models.ForeignKey('Tag', on_delete=models.SET_NULL, null=True, blank=True)
is_tag_new = models.BooleanField(default=False)
class Meta:
db_table = 'memo'
class Link(BaseModel):
url = models.URLField(blank=True, null=True)
memo = models.ForeignKey('Memo', on_delete=models.CASCADE, related_name='url')
class Meta:
db_table = 'link'
У меня есть сериализатор с вложенными полями сериализатора, как это
class LinkSerializer(serializers.ModelSerializer):
class Meta:
model = Link
fields = ['url']
class MemoSerializer(serializers.ModelSerializer):
images = serializers.SerializerMethodField()
urls = LinkSerializer(many=True, read_only=True)
memo_mark = BookmarkSerializer(read_only=True)
tag_name = serializers.SerializerMethodField()
tag_color = serializers.SerializerMethodField()
def get_images(self, obj):
image = obj.image_set.all()
return ImageSerializer(instance=image, many=True, context=self.context).data
class Meta:
model = Memo
fields = ['id', 'memo_text', 'is_tag_new', 'memo_mark', 'images', 'urls',
'tag_name', 'tag_color', 'tag', 'created_at', 'updated_at']
def create(self, validated_data):
instance = Memo.objects.create(**validated_data)
urls_data = validated_data.pop('urls')
images_data = self.context['request'].FILES
if images_data is not None:
for images_data in images_data.getlist('image'):
Image.objects.create(memo=instance, image=images_data)
if urls_data is not None:
for urls_data in urls_data:
Link.objects.create(memo=instance, **urls_data)
return instance
Моя первая проблема в том, что urls не отображается
.
вместо этого он отображается следующим образом
{
"id": 39,
"memo_text": null,
"is_tag_new": false,
"images": [],
"tag_name": "URL",
"tag_color": "BL",
"tag": 4,
"created_at": "2022-01-04T04:17:56.221539",
"updated_at": "2022-01-04T04:17:56.221539"
}
<<<Вторая проблема заключается в записи данных в этот вложенный сериализатор. Загрузка нескольких изображений работает нормально, но сохранение нескольких url не работает. Вот картинка моей ошибкимои общие ожидания примерно такие
{
"id": 39,
"memo_text": null,
"is_tag_new": false,
"images": [],
"urls" : [
{
"url" : "https://google.com/"
}
],
"tag_name": "URL",
"tag_color": "BL",
"tag": 4,
"created_at": "2022-01-04T04:17:56.221539",
"updated_at": "2022-01-04T04:17:56.221539"
}
Я предполагаю, что переопределение метода create является причиной того, что запись данных в сериализатор не работает, но я не уверен, как это исправить. Как я должен изменить свой код, чтобы он заработал?