基于ModelSerializer类,完成Car资源的单查,群查,单增接口

序列化:显示车名,车的颜色,车的价格,车的海报,车的品牌

反序列化:必须提供车名,车的价格,车的品牌(车的匹配需要二次确认re_brand),车的颜色默认为银色(可以提供),车的海报不需要提供(默认为空)

models模型类

class Car(models.Model):
COLOR_CHOICE = (
(0, '银色'),
(1, '黑色'),
(2, '红色'),
(3, '灰色')
)
name = models.CharField(max_length=64, verbose_name='名字', blank=True)
color = models.IntegerField(choices=COLOR_CHOICE, default=0, verbose_name='颜色')
price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='价格')
image = models.ImageField(upload_to='car', default='car/default.png', verbose_name='图片')
brand = models.CharField(max_length=64, verbose_name='厂商')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
is_delete = models.BooleanField(default=False, verbose_name='是否删除') class Meta:
verbose_name_plural = '汽车表' def __str__(self):
return self.name # 自定义序列化字段(插拔式,官方提倡使用)
@property
def car_car(self):
return self.get_color_display() @property
def img(self):
from django.conf import settings
return '%s%s%s' % (settings.BASE_URL, settings.MEDIA_URL, self.image)

路由配置

urlpatterns = [
# ModelSerializer 序列化
url(r'^v3/cars/$',views.CarV3View.as_view()),
url(r'^v3/cars/(?P<pk>\d+)/$',views.CarV3View.as_view()),
]

视图配置

class CarV3View(APIView):
# 单查群查
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk:
# 单查
car_obj = models.Car.objects.filter(pk=pk, is_delete=False).first()
if not car_obj:
return Response({'status': 1, 'msg': 'geterror'}, status=400)
car_dict = serializers.CarModelSerializer(car_obj, many=False).data
return Response({'status': 0, 'msg': 'ok', 'results': car_dict})
else:
# 群查
car_query = models.Car.objects.filter(is_delete=False).all()
car_dict = serializers.CarModelSerializer(car_query, many=True).data
return Response({'status': 0, 'msg': 'ok', 'results': car_dict}) def post(self, request, *args, **kwargs):
car_obj = serializers.CarModelSerializer(data=request.data)
if car_obj.is_valid():
# 入库
car_obj = car_obj.save()
print(car_obj)
return Response({'status': 0, 'msg': 'ok', 'results': serializers.CarModelSerializer(car_obj).data})
else:
return Response({'status': 1, 'msg': car_obj.errors})

序列化组件配置


class CarModelSerializer(serializers.ModelSerializer):
re_brand = serializers.CharField(min_length=3,max_length=8,write_only=True)
class Meta:
model = models.Car
fields = ('name','car_car','img','price','brand','re_brand')
extra_kwargs = {
'name':{
'min_length':3,
'max_length':8,
'error_messages':{
'min_length':'太短',
'max_length':'太长'
}
},
'car_car':{'read_only':True,'required':False},
'img':{'read_only':True},
} def validated_username(self,value):
if 'SB' in value.lower():
raise serializers.ValidationError('名字中不能含有SB')
return value def validate(self, attrs):
brand = attrs.get('brand')
re_brand = attrs.pop('re_brand')
if re_brand != brand:
raise serializers.ValidationError({'re_brand':'两次输入不一致'})
return attrs

最新文章

  1. Mono 3.2.7发布,JIT和GC进一步改进
  2. magnitude是精确距离,sqrMagnitude是节省CPU的粗略距离,精度有损失
  3. Octopus系列之HttpCustom2.0模板引擎的处理,一个bug的分析
  4. socket实例1
  5. POJ2533:Longest Ordered Subsequence(LIS)
  6. ODBC操作excel
  7. Set up HTTP/2 server with Spring Boot 【基于Spring boot搭建http2.0服务器】
  8. js的event事件
  9. Eclipse导入项目常见问题----facet版本问题04
  10. Vue.js学习笔记(二) - 常用模板语法
  11. poj 1035KINA Is Not Abbreviation
  12. 走近webpack(0)--正文之前的故事
  13. 看看腾讯是怎么做产品设计分析的 - 腾讯QQ音乐业务产品规划
  14. Android滑动列表(拖拽,左滑删除,右滑完成)功能实现(1)
  15. js定义数组集合
  16. 如何验证代理ip的正确性
  17. HTML中文本过长时自动隐藏末尾部分或中间等任意部分
  18. 使用tcpdump测试反向代理和lvs的nat区别
  19. Day 06 元组,字典,集合
  20. python爬虫实例--网易云音乐排行榜爬虫

热门文章

  1. SSH整合时执行hibernate查询报错:java.lang.ClassCastException: com.ch.hibernate.Depart
  2. datagrid 的标题的内容不对应整齐
  3. jquery对于ajax的封装
  4. 使用Excel表格导入数据到Oracle表
  5. InfluxDB的安装和简介
  6. POJ 1269 /// 判断两条直线的位置关系
  7. HttpServletRequest的方法详细说明
  8. CentOS7-Minimal安装MySQL服务
  9. Python基础知识之4——三大控制结构
  10. struts2文件上传,文件类型 allowedTypes对应