models:
class Goods(models.Model):
"""
商品
"""
category = models.ForeignKey(GoodsCategory, verbose_name="商品类目", on_delete=models.CASCADE)
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 = UEditorField(verbose_name=u"内容", imagePath="goods/images/", width=1000,
# height=300,filePath="goods/files/", 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="是否热销")
add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")
class Meta:
verbose_name = '商品'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
M1:
views
class GoodsSerializer(ModelSerializer):
""""""
class Meta:
model = models.Goods
fields = "__all__"
#这个可以跨表操作,指查询的深度
depth = 2
class GoodsView(APIView):
def get(self, request, *args, **kwargs):
goods_list = models.Goods.objects.all()
"""
如果传递的是queryset,则GoodsSerializer需要many参数;
如果传递的是单个类,则GoodsSerializer不需要many参数,默认为False;
"""
json_goods = GoodsSerializer(instance=goods_list, many=True)
#注意`.data`
return Response(json_goods.data)
M2:
serializer_field_mapping = {
models.AutoField: IntegerField,
models.BigIntegerField: IntegerField,
models.BooleanField: BooleanField,
models.CharField: CharField,
models.CommaSeparatedIntegerField: CharField,
models.DateField: DateField,
models.DateTimeField: DateTimeField,
models.DecimalField: DecimalField,
models.EmailField: EmailField,
models.Field: ModelField,
models.FileField: FileField,
models.FloatField: FloatField,
models.ImageField: ImageField,
models.IntegerField: IntegerField,
models.NullBooleanField: NullBooleanField,
models.PositiveIntegerField: IntegerField,
models.PositiveSmallIntegerField: IntegerField,
models.SlugField: SlugField,
models.SmallIntegerField: IntegerField,
models.TextField: CharField,
models.TimeField: TimeField,
models.URLField: URLField,
models.GenericIPAddressField: IPAddressField,
models.FilePathField: FilePathField,
}
views
class GoodsSerializer(Serializer):
#如果要深度查询,需要使用source参数
category = serializers.CharField(source="category.name")
goods_sn = serializers.CharField()
name = serializers.CharField()
click_num = serializers.IntegerField()
sold_num = serializers.IntegerField()
fav_num = serializers.IntegerField()
goods_num = serializers.IntegerField()
market_price = serializers.FloatField()
shop_price = serializers.FloatField()
goods_brief = serializers.CharField()
ship_free = serializers.BooleanField()
goods_front_image = serializers.ImageField()
is_new = serializers.BooleanField()
is_hot = serializers.BooleanField()
add_time = serializers.DateTimeField()
class GoodsView(APIView):
def get(self, request, *args, **kwargs):
# goods_list = models.Goods.objects.all()
goods_list = models.Goods.objects.first()
json_goods = GoodsSerializer(instance=goods_list, )
return Response(json_goods.data)
M3:
views
class MyCharField(serializers.CharField):
#重写to_representation,实现自定制!
def to_representation(self, value):
data_list = []
for data in data_list:
data_list.append(data.name)
return data_list
class GoodsSerializer(Serializer):
category = MyCharField(source="supplier.all")
goods_sn = serializers.CharField()
name = serializers.CharField()
class MyCharField(serializers.CharField):
def to_representation(self, value):
return {'pk': value.pk, 'name': value.name}
class GoodsSerializer(Serializer):
#这句话的意思是对每个罗列的条目进行自定制化显示
category = serializers.ListField(child=MyCharField(), source="supplier.all")
goods_sn = serializers.CharField()
name = serializers.CharField()
推荐使用:
class GoodsSerializer(Serializer):
# category = serializers.ListField(child=MyCharField(), source="supplier.all")
#使用SerializerMethodField可以挂载函数,这样实现高度化定制
category = serializers.SerializerMethodField()
"""必须以get_开头"""
def get_category(self):
cata_list = models.Goods.objects.all()
data_list = []
for cata in cata_list:
#返回字典形式
data_list.append({"cata":cata.name})
return data_list
补充数据校验:
class GoodsValidator(object):
def __init__(self, base):
self.base = base
def __call__(self, value):
if value != self.base:
raise serializers.ValidationError(value)
class GoodsSerializer(serializers.Serializer):
#直接在字段内校验数据
name = serializers.CharField(min_length=8)
price = serializers.CharField(error_messages={'required': '必填'}, validators=[GoodsValidator('hello')])
class GoodsValidator(object):
def __init__(self, base):
self.base = base
def __call__(self, value):
if value != self.base:
raise serializers.ValidationError(value)
class GoodsSerializer(serializers.ModelSerializer):
class Meta:
model = models.Goods
fields = "__all__"
#这样也能校验数据
extra_kwargs = {
'name': {'min_length': 6},
'price': {'validators': [GoodsValidator('hello'), ]}
}