model
class Goods(BaseModels): """ 商品 """ category = models.ForeignKey(GoodsCategory, verbose_name="商品类目", on_delete=models.SET_NULL, null=True, blank=True) goods_sn = models.CharField(max_length=50, default="", verbose_name="商品唯一货号") name = models.CharField(max_length=100, verbose_name="商品名") click_num = models.IntegerField(default=0, verbose_name="点击数") sold_num = models.IntegerField(default=0, verbose_name="商品销售量") fav_num = models.IntegerField(default=0, verbose_name="收藏数") goods_num = models.IntegerField(default=0, verbose_name="库存数") market_price = models.FloatField(default=0, verbose_name="市场价格") shop_price = models.FloatField(default=0, verbose_name="本店价格") goods_brief = models.TextField(max_length=500, verbose_name="商品简短描述") goods_desc = models.TextField(verbose_name="内容", default='') ship_free = models.BooleanField(default=True, verbose_name="是否承担运费") goods_front_image = models.ImageField(upload_to="goods/images/", null=True, blank=True, verbose_name="封面图") is_new = models.BooleanField(default=False, verbose_name="是否新品") is_hot = models.BooleanField(default=False, verbose_name="是否热销") class Meta: verbose_name = '商品' verbose_name_plural = verbose_name def __str__(self): return self.name
Serializer
from rest_framework import serializers from . import models class CategorySerializer(serializers.ModelSerializer): class Meta: model = models.GoodsCategory fields = '__all__' class GoodsSerializer(serializers.Serializer): name5 = serializers.CharField(source='name') # source指定字段名, 但该字段名不能与name5重名 goods_sn = serializers.CharField() # 参数write_only序列化的时候, 该字段不显示 参数read_only反序列化的时候该字段不传 category = serializers.CharField(source='category.name') # 外键返回一个category对象, 可以使用source指定对象中的属性 category.name type = serializers.CharField(source='category.get_category_type_display') # 通过get_'字段名'_display获取choice的值 func = serializers.SerializerMethodField() # 通过SerializerMethodField方法返回一个钩子函数的返回值 types = serializers.SerializerMethodField() # 通过自定义字典的元素返回数据 typeall = serializers.SerializerMethodField() # 通过序列化类返回数据 def get_func(self, obj): # 必须使用get_'字段名'作为方法名, 必须传入一个参数, obj 为Goods对象 return obj.name def get_types(self, obj): return {'name':obj.category.name, 'desc': obj.category.desc} def get_typeall(self, obj): res = CategorySerializer(obj.category) return res.data
ModelSerializer
from rest_framework import serializers from . import models class GoodsSerializer(serializers.ModelSerializer): class Meta: model = models.Goods # fields = '__all__' # 全部字段 # fields = ['name', 'shop_price'] # 列表中的字段 exclude = ['name', 'shop_price'] # 排除列表中的字段, 不能与fields一起使用 depth = 1 # 深度为1, 最多推荐3 # 同Serializer方法使用更改字段
反序列化
serializer
from rest_framework import serializers from . import models class GoodsSerializer(serializers.Serializer): name5 = serializers.CharField(source='name') # source指定字段名, 但该字段名不能与name5重名 def create(self, validated_data): # 必须重写create 方法, 不然会断言 ret = models.Goods.objects.create(**validated_data) # 将传过来的数据保存数据库 return ret
views post
def post(self, request): back_dic = {'code': 100, 'msg': '', 'data': None} goodser = serialize.GoodsSerializer(data=request.data) # 将传过来的数据反序列化 if goodser.is_valid(): # 通过is_valid为True, 并且将数据添加进validated_data ret = goodser.create(goodser.validated_data) # 重写create方法 back_dic['msg'] = '添加成功' back_dic['data'] = ret.name return Response(back_dic)
全局钩子与局部钩子校验数据
from rest_framework import serializers from . import models from rest_framework.exceptions import ValidationError class GoodsSerializer(serializers.ModelSerializer): class Meta: model = models.Goods # fields = '__all__' # 全部字段 fields = ['name', 'shop_price'] # 列表中的字段 # exclude = ['name', 'shop_price'] # 排除列表中的字段, 不能与fields一起使用 depth = 1 # 深度为1, 最多推荐3 # 同Serializer方法使用更改字段 def validate_name(self, value): if value == '123': print(value) # value为该字段的值 raise ValidationError('不能为123') # 将异常添加入errors中 可以通过goodser.errors获取 return value def validate(self, attrs): if attrs.get('name') == attrs.get('shop_price'): # attrs 为校验的数据, 为一个字典 raise ValidationError('123') return attrs