通过此方法可以实现添加商品的功能:
# serializers.py
class GoodSerializer(serializers.Serializer):
name = serializers.CharField(required=True, max_length=300)
click_num = serializers.IntegerField(default=0)
goods_front_image = serializers.ImageField()
def create(self, validated_data):
"""
Create and return a new `Snippet` instance, given the validated data.
"""
return Goods.objects.create(**validated_data)
# views.py/class GoodListView
def post(self, request, format=None):
serializer = GoodSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
但是 添加商品是通过后台 所以前端页面不存在这功能 删掉 = =
今天主要说的是通过modelserializer实现之前的数据序列化功能
先说serializers.py
from rest_framework import serializers
from goods.models import Goods, GoodsCategory
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = GoodsCategory
fields = "__all__"
class GoodSerializer(serializers.ModelSerializer):
# 嵌套序列化 因为Goods中有其中一个外键是GoodsCategory 正常序列化时只会序列化出ID值。如果想要嵌套显示出GoodsCategory的话就这样操作:
1. 新建一个 CategorySerializer类 就上面那个
2. 在该类中 自定义form,直接按如下输入即可
category = CategorySerializer()
class Meta:
model = Goods
# 这里是决定返回多少字段的地方 如果用__all__的话就是导出所有字段
# fields = ('name', 'click_num', 'market_price', 'add_time')
fields = "__all__"
# views.py
# 这样就可以完成序列化了
class GoodsListView(APIView):
def get(self, request, format=None):
goods = Goods.objects.all()[:10]
# 因为goods是一个queryset列表对象 所以需要Many=True
goods_serializer = GoodSerializer(goods, many=True)
return Response(goods_serializer.data)
页面返回的显示效果
有一个bug需要说下就是 在这个rest自动生成的页面中右上角是可以登录的 但是测试的时候发现报错 原因是 UserProfile 的Model的返回字段是错的 要改成self.username
class UserProfile(AbstractUser):
"""
用户
"""
GENDER_CHOICES = (
('male', u'男'),
('female', u'女')
)
name = models.CharField(max_length=30, null = True, blank = True, verbose_name=u'姓名')
birthday = models.DateField(null = True, blank=True, verbose_name=u'出生年月')
mobile = models.CharField(max_length=11, verbose_name=u'电话')
gender = models.CharField(max_length=6, choices=GENDER_CHOICES, default='female', verbose_name=u'性别')
email = models.CharField(max_length=100, null=True, blank=True, verbose_name=u'邮箱')
class Meta:
verbose_name = u'用户'
verbose_name_plural = verbose_name
# 这里
def __str__(self):
return self.username
完结