python - 如何在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
解决方案
你想使用SlugRelatedField
而不是ImageSerializer
在你的PostSerializer
:
class PostSerializer (serializers.ModelSerializer) :
...
images = serializers.SlugRelatedField(many=True, read_only=True, slug_field='image')
推荐阅读
- excel - 在 Excel 中制作文本和代数方程的下拉列表
- apache-spark - ContextCleaner:已清理的蓄电池在 scala spark 中是什么意思?
- laravel - 如何在laravel中保存输入的动态名称
- spring-boot - 如果从不同的控制器生成异常,则使用 @controlleradvice 和 @exceptionhandler 对同一异常的不同响应
- c# - 如何在 xamarin 表单中使用默认值格式化电话号码
- pandas - 如何通过具有 NaN 值的多个(即所有可用的)属性对条目进行分组?
- c# - 当我得到 CompareTo() 时,如何按顺序在排序的 C# 列表中插入多个对象
- r - 在 R 中创建具有多个类别的单个变量
- java - 在定义的时间段后关闭活动
- objective-c - 调用方法时源文件中的目标 C 编辑器占位符