1.新建一个django项目,定义一个Car类,有name字符串属性,color整型选择属性(0:银色,1:黑色,2:红色,3:灰色),price全精度小数类型,image图片文件类型,brand字符串类型
2.基于ModelSerializer类,完成Car资源的单查,群查,单增接口
序列化:显示车名,车的颜色,车的价格,车的海报,车的品牌
反序列化:必须提供车名,车的价格,车的品牌(车的匹配需要二次确认re_brand),车的颜色默认为银色(可以提供),车的海报不需要提供(默认为空)
# model.py from django.db import models class Car(models.Model): """ name字符串属性, color整型选择属性(0:银色,1:黑色,2:红色,3:灰色), price全精度小数类型, image图片文件类型, brand字符串类型 """ COLOR_CHOICES = [(0, '银色'), (1, '黑色'), (2, '红色'), (3, '灰色')] name = models.CharField(max_length=64) color = models.IntegerField(choices=COLOR_CHOICES, default=0) price = models.DecimalField(max_digits=10, decimal_places=2) image = models.ImageField(upload_to='img', default='img/default.png') brand = models.CharField(max_length=64) @property def car_color(self): return self.get_color_display()
serializers.py from rest_framework import serializers from . import models class CarModelSerializer(serializers.ModelSerializer): re_brand = serializers.CharField(write_only=True) class Meta: model = models.Car fields = ['name', 'price', 'color', 'car_color', 'image', 'brand', 're_brand'] extra_kwargs = { 'image': { 'read_only': True }, 'color': { 'write_only': True } } def validate(self, attrs): brand = attrs.get('brand') re_brand = attrs.pop('re_brand') if brand != re_brand: raise serializers.ValidationError({'re_brand': '品牌不一致'}) return attrs
总路由
from django.conf.urls import url, include from django.contrib import admin from django.views.static import serve from django.conf import settings urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^api/', include('api.urls')), url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}), ]
子路由
from django.conf.urls import url from . import views urlpatterns = [ # 自定义序列化 url(r'^cars/$', views.CarAPIView.as_view()), url(r'^cars/(?P<pk>\d+)/$', views.CarAPIView.as_view()), url(r'^publishes/$', views.PublishAPIView.as_view()), ]
.