wtf
#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
posted on 2019-12-30 12:00  wtfss  阅读(153)  评论(0编辑  收藏  举报