作业
'''
response.py
'''
from rest_framework.response import Response
class APIResponse(Response):
def __init__(self,status=0,msg='ok',results=None,http_status=None,
headers=None,exception=False,content_type=None,**kwargs):
data={
'status':status,
'msg':msg,
}
if results is not None:
data['results']=results
data.update(**kwargs)
super().__init__(data=data,status=http_status,headers=headers,exception=exception,content_type=content_type)
'''
models,py
'''
from django.db import models
# Create your models here.
class BaseModel(models.Model):
is_delete = models.BooleanField(default=False)
create_time = models.DateTimeField(auto_now_add=True)
class Meta:
abstract=True
class Car(BaseModel):
CHOICE_COLOR=(
(1,'红色'),
(2,'白色'),
(2,'蓝色'),
)
name=models.CharField(max_length=64,verbose_name='车名',unique=True)
price=models.DecimalField(max_digits=5,decimal_places=2,verbose_name='价格')
color=models.IntegerField(choices=CHOICE_COLOR,default=1,verbose_name='颜色')
img=models.ImageField(upload_to='img',default='img/111.jpg')
brand=models.CharField(max_length=64,verbose_name='品牌')
shops=models.ForeignKey(to='Shop',db_constraint=False,related_name='cars')
sponsors=models.ForeignKey(to='Sponsor',db_constraint=False,related_name='cars')
@property
def info(self):
return {
'car_color':self.get_color_display(),
'shop_name':self.shops.name,
'sponsors_name':self.sponsors.name,
}
class Meta:
verbose_name_plural='汽车表'
class Shop(BaseModel):
name=models.CharField(max_length=64,verbose_name='商家名',unique=True)
class Meta:
verbose_name_plural='商家表'
class Sponsor(BaseModel):
name=models.CharField(max_length=64,verbose_name='赞助商')
class Meta:
verbose_name_plural='赞助商表'
class SponsorDetail(BaseModel):
address=models.CharField(max_length=64,verbose_name='地址')
phone=models.CharField(max_length=64,verbose_name='手机号')
sponsor=models.OneToOneField(to=Sponsor,related_name='detail',db_constraint=False)
class Meta:
verbose_name_plural='赞助商信息'
'''
seriailzer.py
'''
from rest_framework import serializers
from api import models
class CarModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Car
fields = ['name','price','brand','info','shops','sponsors']
extra_kwargs = {
'sponsors':{
'write_only':True
},
'shops': {
'write_only': True
},
}
'''
views视图
'''
from api import models
# Create your views here.
from rest_framework.views import APIView
from rest_framework.response import Response
from api import response,serializer
class CarsApiView(APIView):
def get(self,request,*args,**kwargs):
pk = kwargs.get('pk')
if pk:
car_obj = models.Car.objects.filter(is_delete=False,pk=pk).first()
car_ser = serializer.CarModelSerializer(car_obj)
else:
car_query = models.Car.objects.filter(is_delete=False).all()
car_ser = serializer.CarModelSerializer(car_query,many=True)
return response.APIResponse(results=car_ser.data)
def delete(self,request,*args,**kwargs):
pk = kwargs.get('pk')
if pk:
pks=[pk]
else:
pks = request.data
try:
rows = models.Car.objects.filter(is_delete=False, pk__in=pks).update(is_delete=True)
print(rows)
except:
return response.APIResponse(status=1,msg='数据有误')
if rows:
return response.APIResponse(status=0,msg='删除成功')
def post(self,request,*args,**kwargs):
if isinstance(request.data,dict):
many=False
elif isinstance(request.data,list):
many=True
else:
return Response(data={
'detail':'数据有误'
},status=400)
car_ser = serializer.CarModelSerializer(data=request.data,many=many)
car_ser.is_valid(raise_exception=True)
car_obj_or_list = car_ser.save()
return response.APIResponse(results=serializer.CarModelSerializer(car_obj_or_list,many=many).data)
def put(self,request,*args,**kwargs):
pk=kwargs.get('pk')
if pk:
try:
car_instance = models.Car.objects.get(is_delete=False,pk=pk)
except:
return Response({'detail':'pk error'},status=400)
car_ser = serializer.CarModelSerializer(isinstance=car_instance,data=request.data)
car_ser.is_valid(raise_exception=True)
car_obj = car_ser.save()
return response.APIResponse(results=serializer.CarModelSerializer(car_obj).data)
else:
request_data = request.data
try:
pks = []
for dic in request_data:
pk = dic.pop('pk') # 解决分析1,没有pk pop方法就会抛异常
pks.append(pk)
book_query = models.Car.objects.filter(is_delete=False, pk__in=pks).all()
if len(pks) != len(book_query):
raise Exception('pk对应的数据不存在')
except Exception as e:
return Response({'detail': '%s' % e}, status=400)
book_ser = serializer.CarModelSerializer(instance=book_query, data=request_data, many=True)
book_ser.is_valid(raise_exception=True)
book_list = book_ser.save()
return response.APIResponse(results=serializer.CarModelSerializer(book_list, many=True).data)