day 75作业
汽车image资源的群查接口
models模型类配置
from django.db import models
from django.conf import settings
'''
表关系梳理:
- 汽车厂商与汽车:一对多
- 汽车与赞助商:多对多
- 赞助商与赞助商详情:一对一
'''
# 基表
class BaseModel(models.Model):
create_time = models.DateTimeField(auto_now_add=True)
is_delete = models.BooleanField(default=False)
class Meta:
abstract = True
# 汽车表
class Car(BaseModel):
name = models.CharField(max_length=255)
price = models.DecimalField(max_digits=10,decimal_places=2)
image = models.ImageField(upload_to='car',default='car/default.png',verbose_name='汽车图片')
brands = models.ForeignKey(to='Brand',related_name='cars',db_constraint=False,on_delete=models.DO_NOTHING)
sponsors = models.ManyToManyField(to='Sponsor',db_constraint=False,related_name='cars')
class Meta:
verbose_name_plural = "汽车表"
def __str__(self):
return self.name
@property
def img(self):
return '%s%s%s' % (settings.BASE_URL, settings.MEDIA_URL, self.img)
@property
def brands_info(self):
return {
'name':self.brands.name,
'address':self.brands.address
}
@property
def sponsors_list(self):
sponsors_list_temp = []
sponsors = self.sponsors.all()
for sponsor in sponsors:
sponsor_dict = {'name':sponsor.name}
try:
sponsor_dict['phone'] = sponsor.detail.phone
except:
sponsor_dict['phone'] = '无'
sponsors_list_temp.append(sponsor_dict)
return sponsors_list_temp
# 汽车厂商表
class Brand(BaseModel):
name = models.CharField(max_length=255)
address = models.CharField(max_length=255)
# 赞助商表
class Sponsor(BaseModel):
name = models.CharField(max_length=255)
# 赞助商详情表
class Sponsor_Detail(BaseModel):
phone = models.CharField(max_length=11)
sponsor = models.OneToOneField(to='Sponsor',db_constraint=False,on_delete=models.CASCADE,related_name='detail')
settings配置media
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
路由层配置media
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/', include('api.urls')),
url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}),
]
- 执行数据库迁移命令
- 创建超级用户
- 登录django-admin后台
- 修改汽车表信息,上传汽车图片
群查接口
路由层
url(r'^v6/cars/$',views.CarListAPIView.as_view())
视图层
# 作业,单独完成群查接口
from rest_framework.generics import ListAPIView
class CarListAPIView(ListAPIView):
queryset = models.Car.objects.filter(is_delete=False).all()
serializer_class = serializer.CarModelSerializer
序列化类
from rest_framework import serializers
from api import models
class CarListSerializer(serializers.ListSerializer):
def update(self, instance_list, validated_data_list):
return [
self.child.update(instance_list[index],attrs) for index,attrs in enumerate(validated_data_list)
]
class CarModelSerializer(serializers.ModelSerializer):
class Meta:
list_serializer_class = CarListSerializer
model = models.Car
fields = ['name','price','img','brands','sponsors','brands_info','sponsors_list']
extra_kwargs = {
'img':{
'read_only':True
},
'brands':{
'write_only':True,
},
'sponsors':{
'write_only': True
}
}
汽车资源的单查,群查,单增,单改,单删接口
路由配置
url(r'^v7/cars/$', views.ViewGenericViewSet.as_view({
'get': 'get',
'post': 'create',
})),
url(r'^v7/cars/(?P<pk>\d+)/$', views.ViewGenericViewSet.as_view({
'get': 'get',
'patch':'update',
'delete':'destroy',
})),
视图配置
# 作业2:继承GenericViewSet工具集完成汽车资源的单查,群查,单增,单改,单删接口
from rest_framework.viewsets import GenericViewSet
class ViewGenericViewSet(GenericViewSet):
queryset = models.Car.objects.filter(is_delete=False).all()
serializer_class = serializer.CarModelSerializer
lookup_url_kwarg = 'pk'
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
def perform_create(self, serializer):
serializer.save()
from rest_framework.settings import api_settings
# 单查 群查
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk:
return self.retrieve(request, *args, **kwargs)
return self.list(request, *args, **kwargs)
# 单增,
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
# headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=201)
# 单局部改,
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', True)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
car_obj = serializer.save()
if getattr(instance, '_prefetched_objects_cache', None):
instance._prefetched_objects_cache = {}
return APIResponse(results=self.get_serializer(car_obj).data)
# 单删接口
def destroy(self, request, *args, **kwargs):
car_obj = self.get_object()
if not car_obj:
return APIResponse(1, msg="删除失败")
car_obj.is_delete = True
car_obj.save()
return APIResponse(msg="删除成功")

浙公网安备 33010602011771号