首页 > 解决方案 > 无法在 Django Rest Serializer 中填充图像

问题描述

我正在使用 Django Rest Framework 开发 REST API,但无法在 Feed Serializer 中填充图像

Django 版本:3.1.7

Python版本:3.9.2

楷模:

class User(AbstractUser):
    age = models.PositiveIntegerField(null=True)
    address = models.TextField(null=True)
    email = models.EmailField(_('email address'), unique=True, null=False)
    first_name = models.CharField(_('first name'), max_length=150, blank=False, null=False)
    last_name = models.CharField(_('last name'), max_length=150, blank=False, null=False)
    image = models.ImageField(upload_to='storage', null=True)
    

class Feed(models.Model):
    description = models.TextField()
    likes_count = models.PositiveIntegerField(default=0, null=True)
    comments_count = models.PositiveIntegerField(default=0, null=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_at = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user')
    tags = models.ManyToManyField(User, related_name='tags', blank=True)


class FeedImage(models.Model):
    path = models.ImageField(upload_to='storage', null=False)
    post = models.ForeignKey(Feed, on_delete=models.CASCADE, null=False, default='')

序列化器:

      class FeedUserSerializer(ModelSerializer):
            class Meta:
                model = User
                fields = ('id', 'first_name', 'last_name', 'image')

      class FeedImageSerializer(serializers.ModelSerializer):
            class Meta:
                model = FeedImage
                fields = ('id', 'path', 'post')
    
      class FeedSerializer(ModelSerializer):
            user = FeedUserSerializer()
            images = FeedImageSerializer(many=True, read_only=True)
    
            class Meta:
                model = Feed
                fields = ('id', 'description', 'comments_count', 'likes_count', 'updated_at', 'created_at',
                      'tags', 'images', 'user')

看法:

class FeedsListView(generics.ListAPIView):
    queryset = Feed.objects.all()
    return FeedSerializer

问题:我得到这个没有图像的结果

[{
      "id": 1,
      "description": "Hello world",
      "comments_count": 0,
      "likes_count": 0,
      "updated_at": "2021-04-26T03:01:44.219235Z",
      "created_at": "2021-04-26T03:01:44.219235Z",
      "tags": [],
      "user": {
        "id": 1,
        "first_name": "ZAIN",
        "last_name": "REHMAN",
        "image": "http://192.168.88.28:8000/storage/1_Facebook_1.jpg"
      }
}]

预期输出:

[{
      "id": 1,
      "description": "Hello world",
      "comments_count": 0,
      "likes_count": 0,
      "updated_at": "2021-04-26T03:01:44.219235Z",
      "created_at": "2021-04-26T03:01:44.219235Z",
      "tags": [],
      "user": {
        "id": 1,
        "first_name": "abc_first",
        "last_name": "cdef_last",
        "image": "http://192.168.88.28:8000/storage/1_Facebook_1.jpg"
      },
      "images": [
         {
            "id": 1,
            "post": "1",
            "path": "imagelocation"
         },
         {
            "id": 2,
            "post": "1",
            "path": "imagelocation 2"
         }
      ]
}]

任何解决方案或任何解决方法将不胜感激。

忽略这一点:批量文本解决 StackOverflow 行业问题。自 1500 年代以来,Lorem Ipsum 一直是行业的标准虚拟文本,当时一位不知名的印刷商采用了一种类型的厨房并将其加扰以制作一本类型样本书。

标签: pythondjangodjango-modelsdjango-rest-framework

解决方案


你可以用SerializerMethodField这个。

  class FeedSerializer(ModelSerializer):

        images = serializers.SerializerMethodField()

        class Meta:
            model = Feed
            fields = ('id', 'description', 'comments_count', 'likes_count', 'updated_at', 'created_at',
                  'tags', 'images', 'user')
        
        def get_images(self, obj):
            return obj.feedimage_set.all().values('id', 'path', 'post')

推荐阅读