#models.py
from django.db import models
# 汽车表、汽车商家表、赞助商表、赞助商详情表
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 Meta:
verbose_name_plural = '汽车'
def __str__(self):
return self.name
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: # 连表可能会出现问题,所以要异常处理
return self.sponsor.name + '的详情'
except:
return super().__str__()
#serializers.py
from rest_framework import serializers
from . import models
class SponsorModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Sponsor
fields = ('name', 'phone')
class CarModelSerializer(serializers.ModelSerializer):
# sponsors = SponsorModelSerializer(many=True) # 用子序列化完成外键,外键就不能参与反序列化
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 rest_framework.views import APIView
from rest_framework.response import Response
from .response import APIResponse
from . import models, serializers
class CarAPIView(APIView):
# 群查
def get(self, request, *args, **kwargs):
car_query = models.Car.objects.filter(is_delete=False).all()
car_ser = serializers.CarModelSerializer(instance=car_query, many=True)
return APIResponse(results=car_ser.data)
""" 视图家族
from rest_framework import views, mixins, generics, viewsets
views:视图类 - APIView,GenericAPIView(generics中)
mixins:视图工具类 - CreateModelMixin,ListModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
generics:工具视图类 - 九个类
viewsets:视图集 - 两个视图集基类,两个视图集子类,一个工具类
"""
# 回顾APIView类:1)拥有View的所有 2)重写as_view 3)重写dispatch 4)一系列类属性
# GenericAPIView类
# 1)拥有APIView的所有
from rest_framework.generics import GenericAPIView
class CarGenericAPIView(GenericAPIView):
# 不能直接写到objects结束,因为objects结束时,不是QuerySet对象,而是Manager对象,但 .all() 和 .filter() 后一定是QuerySet对象
queryset = models.Car.objects.filter(is_delete=False).all()
serializer_class = serializers.CarModelSerializer
lookup_url_kwarg = 'pk'
# 群查
"""
def get(self, request, *args, **kwargs):
# car_query = models.Car.objects.filter(is_delete=False).all()
car_query = self.get_queryset()
# car_ser = serializers.CarModelSerializer(instance=car_query, many=True)
car_ser = self.get_serializer(car_query, many=True)
return APIResponse(results=car_ser.data)
"""
# 单查
def get(self, request, *args, **kwargs):
# pk = kwargs.get('pk')
# car_obj = models.Car.objects.filter(is_delete=False).filter(pk=pk).first()
car_obj = self.get_object()
# car_ser = serializers.CarModelSerializer(car_obj)
car_ser = self.get_serializer(car_obj)
return APIResponse(results=car_ser.data)
# mixins视图工具类
from rest_framework.mixins import RetrieveModelMixin, ListModelMixin, CreateModelMixin
class CarReadCreateGenericAPIView(ListModelMixin, RetrieveModelMixin, CreateModelMixin, GenericAPIView):
queryset = models.Car.objects.filter(is_delete=False).all()
serializer_class = serializers.CarModelSerializer
lookup_url_kwarg = 'pk'
# 群查
# """
def get(self, request, *args, **kwargs):
# car_query = self.get_queryset()
# car_ser = self.get_serializer(car_query, many=True)
# return APIResponse(results=car_ser.data)
return self.list(request, *args, **kwargs)
# """
# 单查
"""
def get(self, request, *args, **kwargs):
# car_obj = self.get_object()
# car_ser = self.get_serializer(car_obj)
# return APIResponse(results=car_ser.data)
response = self.retrieve(request, *args, **kwargs)
return APIResponse(results=response.data)
"""
# 单增
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
# Generics工具视图类
# 单独完成单查接口
from rest_framework.generics import RetrieveAPIView
class CarRetrieveAPIView(RetrieveAPIView):
queryset = models.Car.objects.filter(is_delete=False).all()
serializer_class = serializers.CarModelSerializer
lookup_url_kwarg = 'pk'
# 单独完成群查接口
from rest_framework.generics import ListAPIView
class CarListAPIView(ListAPIView):
queryset = models.Car.objects.filter(is_delete=False).all()
serializer_class = serializers.CarModelSerializer
# 单查(get)、单整体改(put)、单局部改(patch)、单删接口(delete)
from rest_framework.generics import RetrieveUpdateDestroyAPIView
class CarRetrieveUpdateDestroyAPIView(RetrieveUpdateDestroyAPIView):
queryset = models.Car.objects.filter(is_delete=False).all()
serializer_class = serializers.CarModelSerializer