0. 此接口基于drf
1. 正常的列表套字典格式
1.1 格式
[
{'id':1, 'name': "dbj"},
{'id':1, 'name': "dbj"},
{'id':1, 'name': "dbj"}
]
1.2 序列化器写法1(没有外键)
class IndexDetailDataModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Release
fields = [
'id','name'
]
1.3 序列化器写法2(有外键,配合models)
class IndexDetailDataModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Release
fields = [
'id','name'
]
class Release(BaseModel):
# 反向
@property
def cover_msg_url(self):
# 每一个对象走一遍
name= self.media.all().filter(is_show=True, is_delete=False).first().name
# print(name)
return name
1.4 序列化器写法3(有外键,用source)
class IndexDetailDataModelSerializer(serializers.ModelSerializer):
"""首页的详情页返回的数据"""
topic = serializers.CharField(source='topic.name')
class Meta:
model = models.Release
fields = [
'id', 'position', 'content', 'topic', 'update_time',
]
2. 列表套字典+字典(涉及到外键的返回)
2.1 格式
[
{
"id": 48,
"cover": "xxx",
"content": "xxx",
"favor_count": "2022-02-23T15:01:06.828179Z",
"user": {
'id': 1, 'nickname': 'xxx', 'avatar': 'xxx'
},
"topic": {
'id': 1, 'title': 'xxx'
}
},
]
2.2 序列化器写法1
from api import models
from django.forms import model_to_dict
class NewsModelSerializer(serializers.ModelSerializer):
user = serializers.SerializerMethodField()
topic = serializers.SerializerMethodField()
class Meta:
model = models.News
fields = ['id', 'cover', 'content', 'topic', "user", 'favor_count']
def get_user(self, obj):
# 外键 obj--当前模型对象
return model_to_dict(obj.user, fields=['id', 'nickname', 'avatar'])
def get_topic(self, obj):
# 外键 obj--当前模型对象
if not obj.topic:
return
return model_to_dict(obj.topic, fields=['id', 'title'])
3. 字典套列表+列表+字典(多个字典)(涉及到外键的返回)
3.1 格式
{
"id": 27,
"position": "xx",
"content": "xxxx",
"topic": "xxx",
"nickName": "xx",
"update_time": "2022-02-22T12:08:50.285284Z",
"msg_url": [
{
"cosUrl": "1684846.png"
},
{
"cosUrl": "1684846.png"
},
{
"cosUrl": "1684846.png"
}
]
}
3.2 序列化器配合models写法
class IndexDetailDataModelSerializer(serializers.ModelSerializer):
"""首页的详情页返回的数据"""
topic = serializers.CharField(source='topic.name')
nickName = serializers.CharField(source='userinfo.nickName')
class Meta:
model = models.Release
fields = [
'id', 'position', 'content', 'topic', 'nickName', 'update_time', 'msg_url'
]
class Release(BaseModel):
"""反向查询"""
# 图片链接拼接
@property
def msg_url(self):
msg_url = self.media.all().filter(is_show=True, is_delete=False).values('cosUrl')
return msg_url
4. 字典套列表+列表+字典(单个字典)(涉及到外键的返回)
4.1 格式
{
"position": 27,
"content": "xx",
"topic_id": "xxxx",
"userinfo_id": "xxx",
"cos_data ": [
{
"cosUrl": "1684846.png",
"cosETag": "6",
"cos_media_name": "png",
}
]
}
4.2 序列化器(一般序列化器嵌套)
class MediaModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Media
fields = ['cosUrl', 'cosETag', 'cos_media_name']
class ReleaseModelSerializer(serializers.ModelSerializer):
cos_data = MediaModelSerializer(many=True, write_only=True)
topic_id = serializers.CharField(write_only=True)
userinfo_id = serializers.CharField(write_only=True)
class Meta:
model = models.Release
fields = ['position', 'content', 'topic_id', 'userinfo_id', 'cos_data']