serializer.py
#基于序列化器做的数据 class Bookserializers(serializers.ModelSerializer): class Meta: model=Book # 排除某一个字段 其他字段全部序列化exclude=[] # 修改选项参数extra_kwargs={ # # } # 指定那些字段进行序列化read_only_fields=[] fields="__all__" # fields=[] #反序列化 class Bookserializer(serializers.Serializer): title = serializers.CharField(max_length=64,required=True,label='标题') price = serializers.IntegerField(required=True) color = serializers.CharField(max_length=64,required=False) page_num = serializers.IntegerField(required=False) create_pepole=serializers.CharField(max_length=45,required=False,label='创建人') def validated_btitle(self,value): #单个字段进行校验 if 'title' not in value.lower(): raise serializers.ValidationError("title属性校验不通过") return value def validate(self, attrs): #多个字段进行校验以及联合校验 attrs['title']='title' return attrs
#笔记:====序列化 # 序列化时字段可以比数据库中的字段要多,但是字段名字要与数据库中的名字保持一致 # 序列化关联数据库时, serializers.PrimaryKeyRelatedField(label='',queryset='模型名称中查询数据库的方法',read_only=True) # 其中read_only=True 序列化输出,PrimaryKeyRelatedField默认是将模型进行关联 # serializers.StringRelatedField 默认是将关联模型中__str__方法返回值序列化输出 # serializers.(另一个模型的序列化) 默认是将另一个模型中的字段全部序列化 # 在关联表中进行使用 (在上面三种情况中任选其一 其中属性可以根据自己项目的实际情况进行更改 比如read_only # ) # 反序列化 # 拿到前段传过来的数据(序列化模型名(data=data))》》进行校验(is_valid())》再进行validated_data
views.py class bookModelViewSet(ModelViewSet): '''终极ModelViewSet''' serializer_class = Bookserializer queryset = Book.objects.all() #以上代码 实现了普通的增删改查 #定义自己的方法 @action(methods=['get'],detail=False) # action 解决路由问题 用DefaultRouter生成标准路由 def latest(self,request): '''自定义的方法''' book= Book.objects.latest('id') serializer=self.get_serializer(book) return Response(serializer.data) @action(methods=['put'],detail=True) def read(self, request,pk): book = self.get_object() book.price=request.data.get('bread') book.save() serializer = self.get_serializer(book) return Response(serializer.data)
urls.py
# 只能结合视图集(即只有ModelViewSet)才能自动生成路由 urlpatterns=[ routers=DefaultRouter() routers.register(r'books/',views.bookModelViewSet) urlpatterns +=routers.urls ]