基于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='是否删除')
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
verbose_name_plural = <span class="hljs-string">'汽车表'</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__str__</span><span class="hljs-params">(self)</span>:</span>
<span class="hljs-keyword">return</span> self.name <span class="hljs-comment"># 自定义序列化字段(插拔式,官方提倡使用)</span>

@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})
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">post</span><span class="hljs-params">(self, request, *args, **kwargs)</span>:</span>
car_obj = serializers.CarModelSerializer(data=request.data)
<span class="hljs-keyword">if</span> car_obj.is_valid():
<span class="hljs-comment"># 入库</span>
car_obj = car_obj.save()
print(car_obj)
<span class="hljs-keyword">return</span> Response({<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>, <span class="hljs-string">'msg'</span>: <span class="hljs-string">'ok'</span>, <span class="hljs-string">'results'</span>: serializers.CarModelSerializer(car_obj).data})
<span class="hljs-keyword">else</span>:
<span class="hljs-keyword">return</span> Response({<span class="hljs-string">'status'</span>: <span class="hljs-number">1</span>, <span class="hljs-string">'msg'</span>: car_obj.errors})</code></pre>

序列化组件配置


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},
}
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">validated_username</span><span class="hljs-params">(self,value)</span>:</span>
<span class="hljs-keyword">if</span> <span class="hljs-string">'SB'</span> <span class="hljs-keyword">in</span> value.lower():
<span class="hljs-keyword">raise</span> serializers.ValidationError(<span class="hljs-string">'名字中不能含有SB'</span>)
<span class="hljs-keyword">return</span> value <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">validate</span><span class="hljs-params">(self, attrs)</span>:</span>
brand = attrs.get(<span class="hljs-string">'brand'</span>)
re_brand = attrs.pop(<span class="hljs-string">'re_brand'</span>)
<span class="hljs-keyword">if</span> re_brand != brand:
<span class="hljs-keyword">raise</span> serializers.ValidationError({<span class="hljs-string">'re_brand'</span>:<span class="hljs-string">'两次输入不一致'</span>})
<span class="hljs-keyword">return</span> attrs</code></pre>

day72test的更多相关文章

随机推荐

  1. struts2类型转换2

    如何自定义类型转换器 ? 1). 为什么需要自定义的类型转换器 ? 因为 Struts 不能自动完成 字符串 到 引用类型 的 转换. 2). 如何定义类型转换器: I. 开发类型转换器的类: 扩展 ...

  2. JS 实现省市联动

    使用 JavaScript 实现选择省份,后面联动改变成相应省份下的市 原理很简单: 首先创建两个select下拉框(省.市) 初始化的时候让省都显示出来,市为空  ................. ...

  3. JSON 单例类

    MD5JSON.h #pragma once #include "include/json/json.h" #include "include/md5/md5.h&quo ...

  4. Myeclipse从外部导入项目时,jsp和html页面中所有的onclick="return xx()"位置均出现cannot return from outside function() or method()错误

  5. iOS ARC下命名规则

    当我在ARC模式下写以下代码的时候,编译器报错 Semantic Issue: Property's synthesized getter follows Cocoa naming conventio ...

  6. How to Hide Apache Tomcat Version Number from Error Pages

    1. 进入tomcat lib目录 cd /usr/local/tomcat7/lib 2. 解压catalina.jar jar xvf catalina.jar 3. 修改ServerInfo.p ...

  7. iServer添加Oracle Plus数据源、服务发布的问题

    今天在将以Oracle Plus为数据源的工作空间发布成服务时,发现服务发布完后,看不见任何数据.最后发现,还需要在iserver服务器上安装oracle客户端才行.整理如下: 一.创建空间数据库账户 ...

  8. 14. TIM of STM32F103ZE

    block diagram 14.3.1 Time-base unit 有三个基础的寄存器: 计数寄存器(TIMx_CNT) 预分配寄存器(TIMx_PSC), 自动重载寄存器(TIMx_ARR) 重 ...

  9. Java 的锁-老王女儿的爱情

    对象锁: new一个对象,都会给这个实例创建一把锁,对象中的方法必须在实例创建后,通过调用方法获取锁,一个线程进去这个方法之前拿到对象的锁,才能调用方法,否则被阻塞,举个例子,老王有个如花似玉的女儿, ...

  10. 第三篇:异步请求遇上for循环怎么做

    场景:读取Excel数据(地名),发送请求到百度地图,从返回的json格式数据取出坐标数据(逗号隔开的两个float型数值),拼接成了分号隔开的一个字符串data,接下来需要利用“百度坐标转换API” ...