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 не работает. Вот картинка моей ошибки


url error

мои общие ожидания примерно такие

{
            "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 является причиной того, что запись данных в сериализатор не работает, но я не уверен, как это исправить. Как я должен изменить свой код, чтобы он заработал?

Вернуться на верх