day_接口初始练习
作业:
1、整理本周所学知识点
2、完成汽车系统表模型的建立(表关系自己设计)
汽车表、汽车商家表、赞助商表、赞助商详情表
1、预习视图家族,用视图家族完成A作业
models.py
#表创建(汽车表、汽车商家表、赞助商表、赞助商详情表)
class BaseModel(models.Model):
is_delete = models.BooleanField(default=False)
createdTime = models.DateTimeField(auto_now_add=True)
class Meta:
abstract = True
class Car(BaseModel):
name = models.CharField(max_length=64)
price = models.DecimalField(max_digits=10, decimal_places=2)
brand = models.ForeignKey(to='Brand', db_constraint=False, null=True, on_delete=models.SET_NULL, related_name='cars')
sponsors = models.ManyToManyField(to='Sponsor', db_constraint=False, related_name='cars')
@property
def brand_name(self):
return self.brand.name
@property
def sponsor_list(self):
sponsor_list_temp = []
for sponsor in self.sponsors.all():
sponsor_dic = {
'name': sponsor.name
}
try:
sponsor_dic['phone'] = sponsor.detail.phone
except:
sponsor_dic['phone'] = '未知'
sponsor_list_temp.append(sponsor_dic)
return sponsor_list_temp
class Brand(BaseModel):
name = models.CharField(max_length=64)
class Meta:
verbose_name_plural = '品牌'
def __str__(self):
return self.name
class Sponsor(BaseModel):
name = models.CharField(max_length=64)
@property
def phone(self):
try:
return self.detail.phone
except:
return "无"
class Meta:
verbose_name_plural = '赞助商'
def __str__(self):
return self.name
class SponsorDetail(BaseModel):
phone = models.CharField(max_length=11)
sponsor = models.OneToOneField(to=Sponsor, db_constraint=False, on_delete=models.CASCADE, related_name='detail')
class Meta:
verbose_name_plural = '赞助商详情'
def __str__(self):
try: # 连表可能会出现问题,所以要异常处理(跨表操作l)
return self.sponsor.name + '的详情'
except:
return super().__str__()
serializer.py
from rest_framework import serializers
from api import models
class CarModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Car
fields = ('name', 'price', 'brand_name', 'sponsor_list', 'brand', 'sponsors')
extra_kwargs = {
'brand': {
'required': True,
'write_only': True
},
'sponsors': {
'required': True,
'write_only': True
},
}
views.py
from .response import APIResponse
from rest_framework.response import Response
from rest_framework.views import APIView
from . import models
from . import 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()
if not car_obj:
return APIResponse(1, 'error', http_status=400)
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 APIResponse(results=car_ser.data)
def post(self, request, *args, **kwargs):
if isinstance(request.data, dict):
many = False
elif isinstance(request.data, list):
many = True
else:
return APIResponse(1, '数据有误', http_status=400)
car_ser = serializer.CarModelSerializer(data=request.data, many=many)
car_ser.is_valid(raise_exception=True)
car_obj = car_ser.save()
return APIResponse(results=serializer.CarModelSerializer(car_obj, many=many).data)
def delete(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk:
pks = [pk]
else:
pks = request.data
try:
rows = models.Book.objects.filter(is_delete=False, pk__in=pks).update(is_delete=True)
except:
return APIResponse(1, '数据有误')
if rows:
return APIResponse(0, '删除成功')
return APIResponse(1, '删除失败')
def patch(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk: # 单改
try:
book_instance = models.Book.objects.get(is_delete=False, pk=pk)
except:
return Response({'detail': 'pk error'}, status=400)
book_ser = serializers.BookModelSerializer(instance=book_instance, data=request.data, partial=True, context={'request': request})
book_ser.is_valid(raise_exception=True)
book_obj = book_ser.save()
return APIResponse(results=serializers.BookModelSerializer(book_obj).data)
else: # 群改
request_data = request.data
try:
pks = []
for dic in request_data:
pk = dic.pop('pk')
pks.append(pk)
book_query = models.Book.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 = serializers.BookModelSerializer(instance=book_query, data=request_data, many=True, partial=True)
book_ser.is_valid(raise_exception=True)
book_list = book_ser.save()
return APIResponse(results=serializers.BookModelSerializer(book_list, many=True).data)