python - 无法在 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 一直是行业的标准虚拟文本,当时一位不知名的印刷商采用了一种类型的厨房并将其加扰以制作一本类型样本书。
解决方案
你可以用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')
推荐阅读
- python - 绘制数据 plt.plot 时,我不断得到一条额外的线。有什么修复吗?
- vulkan - 在 Vulkan 中调用 CreateShaderModule() 后找不到“stateless_validation.h”
- swift - MapBox iOS:如何访问路线坐标以使用折线绘制它
- c++ - 拜耳图像有多少个通道?
- nlp - AttributeError:“示例”对象没有属性“文本”
- junit - JunitReport - 报告格式和 styledir 不起作用
- objective-c - 从 Keychain 获取证书并使用它来创建信任
- java - JComponent 进入非空 JPanel
- java - 是否存在超过 double 数字精度的 Java 数据类型?
- scala - Scala - Spark:获取包含空值的列的列名