首页 > 解决方案 > 如何在django中自定义一个onetomany关系的序列化器数据

问题描述

我为图像模型定义了序列化器,并在调用后序列化器时将其调用到后序列化器以立即提供数据。运行没有问题,但是我没有给我想要的json数据。

现在我把它给你,就是这样。

{
        "pk": 0,
        "author": {
            "id": 0,
            "email": "",
            "username": "",
            "profile": "url",
            "following": 0,
            "followers": 0
        },
        "title": "",
        "text": "",
        "view": 0,
        "images": [
            {
                "image": "url"
            },
            {
                "image": "url"
            },
            {
                "image": "url"
            },
            {
                "image": "url"
            }
        ],
        "like_count": 0,
        "comment_count": 0,
        "liker": [
            0,
            0
        ],
        "tag": null,
        "created_at": "2020-10-06T21:46:48.039354+09:00"
    },

我要这个。

{
            "pk": 0,
            "author": {
                "id": 0,
                "email": "",
                "username": "",
                "profile": "url",
                "following": 0,
                "followers": 0
            },
            "title": "",
            "text": "",
            "view": 0,
            "images": [
                url,
                url,
                url,
                url
            ],
            "like_count": 0,
            "comment_count": 0,
            "liker": [
                0,
                0
            ],
            "tag": null,
            "created_at": "2020-10-06T21:46:48.039354+09:00"
        },

json 将如何以我想要的方式出现?这是我的代码。

序列化程序.py

class ImageSerializer (serializers.ModelSerializer) :
    image = serializers.ImageField(use_url=True)

    class Meta :
        model = Image
        fields = ('image', )

class CommentSerializer (serializers.ModelSerializer) :
    comments_author = userProfileSerializer(read_only=True)

    class Meta :
        model = Comment
        fields = ('pk', 'comments_author', 'text', 'created_at')

    def create (self, validated_data) :
        return Comment.objects.create(**validated_data)

    def validate (self, attrs) :
        text = attrs.get('text', '')

        error = {}

        if text is None :
            error['message'] = '본문은 빈칸일 수 없습니다.'
            raise serializers.ValidationError(error)

        return attrs

class LikeSerializer (serializers.ModelSerializer) :

    class Meta :
        model = Like
        fields = '__all__'

class LikerSerializer (serializers.ModelSerializer) :
    id = serializers.IntegerField(source='liker.pk')

    class Meta :
        model = Like
        fields = ('id', )

class PostSerializer (serializers.ModelSerializer) :
    author = userProfileSerializer(read_only=True)
    like_count = serializers.ReadOnlyField()
    comment_count = serializers.ReadOnlyField()
    images = ImageSerializer(many=True, read_only=True)
    liker = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta :
        model = Post
        fields = ('pk', 'author', 'title', 'text', 'view', 'images', 'like_count', 'comment_count', 'liker', 'tag', 'created_at')

    def create (self, validated_data) :
        images_data = self.context['request'].FILES
        post = Post.objects.create(**validated_data)

        for image_data in images_data.getlist('image') :
            Image.objects.create(post=post, image=image_data)

        return post

    def validate (self, attrs) :
        title = attrs.get('title', '')
        text = attrs.get('text', '')

        error = {}

        if title is None and text is None :
            error['message'] = '제목과 본문은 빈칸일 수 없습니다.'
            raise serializers.ValidationError(error)

        if title is None :
            error['message'] = '제목은 빈칸일 수 없습니다.'
            raise serializer.ValidationError(error)

        if text is None :
            error['message'] = '본문은 빈칸일 수 없습니다.'    
            raise serializer.ValidationError(error)

        return attrs

标签: pythondjangodjango-rest-framework

解决方案


你想使用SlugRelatedField而不是ImageSerializer在你的PostSerializer

class PostSerializer (serializers.ModelSerializer) :
  ...
  images = serializers.SlugRelatedField(many=True, read_only=True, slug_field='image')

推荐阅读