1. 序列化器,未声明的字段
如果一个字段未声明,在全局钩子/局部钩子/validated_data/....都是拿不到的,只能request.data去拿
2. 反序列化的时候,可以传[{'name':dbj",'xx':'11'}]这种格式吗?
2.1 必须可以,
2.2 但是序列化器必须嵌套
2.3 案例
url
path('t1/', views.T2.as_view()),
view
class t1(APIView):
def post(self, request, *args, **kwargs):
ser = T2(data=request.data)
if ser.is_valid()
ser.save()
return Response('ok')
return Response('nok')
serializer
# 测试前端传送过来一个列表
class T1(serializers.Serializer):
name2 = serializers.CharField()
name3 = serializers.CharField()
class T2(serializers.ModelSerializer):
t1 = T1(many=True) # many=True---反向的时候要写,正向不需要写
class Meta:
model = models.Release
fields = ['content', 't1']
def validate(self, attrs):
print(attrs)
# OrderedDict([('content', 'aa'), ('t1', [OrderedDict([('name2', '1'), ('name3', '3')]), OrderedDict([('name2', '1'), ('name3', '3')]), OrderedDict([('name2', '1'), ('name3', '3')])])])
def create(self, validated_data):
print(validated_data)
# OrderedDict([('content', 'aa'), ('t1', [OrderedDict([('name2', '1'), ('name3', '3')]), OrderedDict([('name2', '1'), ('name3', '3')]), OrderedDict([('name2', '1'), ('name3', '3')])])])
前端传送数据格式
{
"content":"aa",
"t1":[
{"name2":"1","name3":"3"},
{"name2":"1","name3":"3"},
{"name2":"1","name3":"3"}
]
}
3.对于表中是外键的字段,反序列化的时候,数据怎么传?
3.2 前端传id即可,他会自动把前端传过来的id,去数据库映射成其所对应的对象模型,
3.3 保存,类似 user_id = 1
4. CreateAPIView
4.1 CreateAPIView,如果仅仅新增,那么不用配置queryset
4.2 案例
class PublishDataAPIView2(CreateAPIView):
"""最新版上传"""
# queryset = models.Release.objects.filter(is_show=True, is_delete=False)
serializer_class = ReleaseModelSerializer
5. RetrieveAPIView
class IndexDetailRetrieveAPIView(RetrieveAPIView):
queryset = models.Release.objects.filter(is_show=True, is_delete=False)
serializer_class = IndexDetailDataModelSerializer
6. 反序列化的时候,数据库动态新增的字段,无法序列化返回
1.1. 在序列化返回字段的时候,只能序列化,数据库原先有的字段。
1.2. 如果在反序列化的过程中,给数据库增加新的字段,同一次请求,序列化的时候,返回的,还是原先数据库,原有的字段,新增的字段,无法返回
2. 解决办法
手动从数据库获取,想要的字段,传给response,让其json化(我们返回前端的,大部分都是json格式)