基于seriallizer类进行简化
html
https://www.cnblogs.com/pythonywy/p/11455508.htmlpython
导入from rest_framework import serializers
框架
与基础serializer类后续使用的做用类似
函数
class 自定义名称(serializers.ModelSerializer): class Meta: model=对应的模型 fields=('参与序列化和反序列的字段1','参与序列化和反序列的字段2') #fields='__all__' 为全部字段 # exclude = ('id', 'is_delete') # 刨除某些字段 # depth = 1 # 跨表自动深度(展现外键表的全部字段)
注意点post
fields
与exclude
不能共存depth
不能控制显示字段,与外键相关的表会所有显示出来例若有两个模型A
与B
,他们的c字段有外键关联ui
modles.pyrest
class B(models.Model): name = models.CharField(max_length=60) class A(models.Model): uid = models.ForeignKey(B,'id') @property #下面调用函数名的时候自动运行函数 def b_name(self): #这里的self是A类 return self.uid.name class AModelSerializer(serializers.ModelSerializer): class Meta: model=A #这里导入A会把A里面的全部名称空间存在的都进行导入 fields=('b_name')
class B(models.Model): name = models.CharField(max_length=60) class A(models.Model): uid = models.ForeignKey(B,'id') #方法一 class BModelSerializer(serializers.ModelSerializer): class Meta: model=B fields=('b_name') class BModelSerializer(serializers.ModelSerializer): b_name = BModelSerializer() class Meta: model=A #这里导入A会把A里面的全部名称空间存在的都进行导入 fields=('b_name') #方法二 #经过自定义字段 class BModelSerializer(serializers.ModelSerializer): b_name = serializers.SerializerMethodField() def get_b_name(self, obj: models.A): return A.uid.name class Meta: model=A #这里导入A会把A里面的全部名称空间存在的都进行导入 fields=('b_name')
反序列话约数条件设置
code
class 自定义名称(serializers.ModelSerializer): class Meta: model=对应的模型 fields=('参与序列化和反序列的字段1','参与序列化和反序列的字段2') extra_kwargs ={ 参与序列化和反序列的字段1:{ 'required': True, #必须填写的字段 'min_length': 3, #.....约数条件 'error_messages': { 'min_length': '过短' } } }
只读只写属性设置
htm
class 自定义名称(serializers.ModelSerializer): class Meta: model=对应的模型 fields=('参与序列化和反序列的字段1','参与序列化和反序列的字段2') extra_kwargs ={ 参与序列化和反序列的字段1:{ 'write_only': True #只写 } 参与序列化和反序列的字段2:{ 'read_only': True #只读 } }
数据没有修改
对象
class BookAPIView(APIView): def get(self, request, *args, **kwargs): book_query = models.Book.objects.all() #假设查咱们定义的书的这个模型 book_ser = serializers.BookModelSerializer(book_query, many=True) return Response(0, 'ok', results=book_ser.data) #用drf框架自带的Response
有添加修改相关操做
class BookAPIView(APIView): def post(self, request, *args, **kwargs): pk=kwargs.get('pk') book_obj = models.Book.objects.get('pk') book_ser = serializers.BookModelSerializer(instance=book_obj,data=request.data) #根据传进来的数据机芯判断 #若是多个数据为book_set = serializers.BookModelSerializer(data=request.data many=true) if book_ser.is_valid(): #这里是咱们设置的ModelSerializer的约数条件看是否能经过 book_ser.save() #这里他会自动进行判断是create方法仍是update方法 return Response(0, 'ok',results=book_ser.data) else: return Response(1, '添加失败', results=book_ser.errors)#用drf框架自带的Response
注意点
:save源码中咱们能够看到instance
有值调用updata方法,没有值调用create方法.因此修改必须加instance参数,传的参数基本上是修改以前的对象有关删除
class BookAPIView(APIView): def post(self, request, *args, **kwargs): book_ser = serializers.BookModelSerializer(data=request.data) #根据传进来的数据机芯判断 #若是多个数据为book_set = serializers.BookModelSerializer(data=request.data many=true) if book_ser.is_valid(): #这里是咱们设置的ModelSerializer的约数条件看是否能经过 book_ser.deleter() #这里他会自动进行判断是create方法仍是update方法 return Response(0, 'ok',results=book_ser.data) else: return Response(1, '删除失败', results=book_ser.errors)#用drf框架自带的Response