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