一.第一版(一般不用)
# 声明序列化器from rest_framework import serializersfrom djangoDome.models import Book class PublisherSerializer(serializers.Serializer): id = serializers.IntegerField() title = serializers.CharField(max_length=32) class AuthorSerializer(serializers.Serializer): id = serializers.IntegerField() name = serializers.CharField(max_length=32) #自定义字段def my_validate(value): if 'xxoo' in value.lower(): #抛敏感词汇 raise serializers.ValidationError('敏感词汇') return value class BookSerializer(serializers.Serializer): id = serializers.IntegerField(required=False) title = serializers.CharField(max_length=32,)# 自定义的加这个参数 validators=[my_validate,] pub_time = serializers.DateField() category=serializers.CharField(source='get_category_display',read_only=True) #此处为多选时用 #read_only = True 正序查找 publisher=PublisherSerializer(read_only=True) #多对一 authors=AuthorSerializer(many=True,read_only=True) #多对多用 many=True #write_only =True 反序查找 要重新定义 post_category = serializers.IntegerField(write_only=True) publisher_id = serializers.IntegerField(write_only=True) author_list = serializers.ListField(write_only=True) #重写 create 方法 def create(self, validated_data): #validated_data 校验通过的数据 就是book_obj # 通过ORM操作给Book表增加数据 book_obj=Book.objects.create(title=validated_data['title'], pub_time=validated_data["pub_time"], category=validated_data["post_category"], publisher_id=validated_data["publisher_id"] ) book_obj.authors.add(*validated_data['author_list']) return book_obj
#重写update 方法def update(self, instance, validated_data): # instance 更新的book_obj 对象 # validated_data 校验通过的数据 # ORM做更新操作 对每个字段进行更新 instance.title=validated_data.get('title',instance.title) instance.pub_time = validated_data.get("pub_time", instance.pub_time) instance.category = validated_data.get("post_category", instance.category) instance.publisher_id = validated_data.get("publisher_id", instance.publisher_id) #此处是对多对多个字段 进行查询 if validated_data.get("author_list"): #set 因为是列表多个数据 instance.authors.set(validated_data["author_list"]) #编辑一定要更新 instance.save() return instance
# 对单个值进行校验 def validate_title(self,value): # value就是title的值 对value处理 if 'xxoo' not in value.lower(): raise serializers.ValidationError('少东西了') return value #对所有字段进行 校验 def validate(self, attrs): # attrs 字典有你传过来的所有的字段 if 'xxoo' in attrs['title'].lower() and attrs["post_category"] == 1: return attrs else: raise serializers.ValidationError('分类或标题不合符要求') 二.第二版本(用这个)用这个添加表里面的信息 直接用字段名
class BookSerializer(serializers.ModelSerializer): #对多选字段,一对多,多对多字段 进行重新定义 此处为序列化的时候显示 category_display=serializers.SerializerMethodField(read_only=True) publisher_info=serializers.SerializerMethodField(read_only=True) authors_info=serializers.SerializerMethodField(read_only=True) #多选查找 obj 就是序列化的每个Book对象 def get_category_display(self,obj): return obj.get_category_display() #一对多查找 def get_publisher_info(self,obj): #找到查找外键的对象 publisher_obj=obj.publisher #返回publisher表的内容 return {'id':publisher_obj.id,'title':publisher_obj.title} #多对多的查找 def get_authors_info(self,obj): #找到所有的对象 authors_obj=obj.authors.all() # 返回authors表的内容 推到式 return [{"id":i.id,'name':i.name}for i in authors_obj] class Meta: model=Book fields='__all__' # exclude=["id"] # 会让你这些所有的外键关系变成read_only = True 最多4层 不建议用 # depth = 1 #相当于extra_kwargs={"默认的字段名称":{自定义的参数配置信息}} #用在反序列化 给表字段添加参数 extra_kwargs={'publisher':{'write_only':True}, "authors": {"write_only": True}}