练习74

models

from django.db import models

'''
汽车表,汽车商家表,赞助商表,赞助商详情表
'''


# Create your models here.
# 基表
class Base(models.Model):
    is_delete = models.BooleanField(default=False, verbose_name='是否注销')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')

    class Meta:
        abstract = True


# 汽车商家表
class CarStore(Base):
    name = models.CharField(max_length=64, verbose_name='汽车商家名')
    address = models.CharField(max_length=64, verbose_name='汽车商家地址')

    @property
    def car_info(self):
        return {
            'name':self.cars.name,
            # 'price':self.cars.price,
        }



# 赞助商表
class CarSponsor(Base):
    name = models.CharField(max_length=64, verbose_name='赞助商名')
    address = models.CharField(max_length=64, verbose_name='赞助商地址')


# 赞助商详情表
class SponsorDetail(Base):
    mobile = models.CharField(max_length=64, verbose_name='联系方式')
    sponsor = models.OneToOneField(to=CarSponsor, related_name='detail', db_constraint=False,
                                   on_delete=models.DO_NOTHING, null=True)


# 汽车表
class Car(Base):
    COLOR_CHOICES = (
        (0, '银色'),
        (1, '黑色'),
        (2, '红色'),
        (3, '灰色'),
    )
    name = models.CharField(max_length=64, verbose_name='汽车名')
    color = models.IntegerField(choices=COLOR_CHOICES, default=0, verbose_name='颜色')
    price = models.DecimalField(max_digits=9, decimal_places=2, verbose_name='价格表')
    img = models.ImageField(upload_to='img', default='img/default.png', verbose_name='汽车图片')
    store = models.ForeignKey(to=CarStore, related_name='cars', db_constraint=False, on_delete=models.DO_NOTHING,
                              null=True)
    sponsor = models.ManyToManyField(to=CarSponsor, related_name='cars', db_constraint=False, )

    @property
    def color_car(self):
        return self.get_color_display()

    @property
    def image(self):
        from django.conf import settings
        return '%s%s%s' % (settings.BASE_URL, settings.MEDIA_URL, self.img)

    @property
    def store_info(self):
        return {
            'name': self.store.name,
            'address': self.store.address,
        }

    @property
    def sponsor_list(self):
        sponsor_list_tmp = []  # 存放所有赞助商格式化数据列表
        sponsors = self.sponsor.all()  # 所有赞助商
        for sponsor in sponsors:
            aponsor_dic = {
                'name': sponsor.name
            }
            try:
                aponsor_dic['mobile'] = sponsor.detail.mobile
            except:
                aponsor_dic['mobile'] = '无'
            sponsor_list_tmp.append(aponsor_dic)  # 将处理过的数据添加到数据列表中
        return sponsor_list_tmp

    class Meta:
        verbose_name_plural = '汽车表'

    def __str__(self):
        return self.name

序列化类

from rest_framework import serializers
from . import models


# 序列化补充
class CarListSerializer(serializers.ListSerializer):
    # 自定义的群增改辅助类,没必要重新写create方法
    def create(self, validated_data):
        return super().create(validated_data)

    # 自定义群改,辅助类
    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固定写法,内部方法
        list_serializer_class = CarListSerializer
        model = models.Car
        fields = ['name', 'color', 'price', 'img', 'color_car', 'image', 'store', 'sponsor', 'store_info',
                  'sponsor_list']

        extra_kwargs = {
            'color_car': {
                'read_only': True
            },
            'image': {
                'read_only': True
            },
            'sponsor': {
                'read_only': True
            }
        }

# 汽车商家表序列化
class CarStoreModelSerializer(serializers.ModelSerializer):
    class Meta:
        list_serializer_class = CarListSerializer
        model = models.CarStore

        fields = ['name', 'address', ]
        # extra_kwargs = {
        #
        #     'car_info': {
        #         'read_only': True
        #     }
        # }

视图类

from rest_framework.views import APIView
from rest_framework.response import Response
from . import models, serializers
from .response import APIResponse


# Create your views here.
class CarAPIView(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 = serializers.CarModelSerializer(car_obj)
        else:
            car_obj = models.Car.objects.filter(is_delete=False).all()
            print(car_obj)

            car_ser = serializers.CarModelSerializer(car_obj, many=True)
        return APIResponse(status=car_ser.data)

    def delete(self, request, *args, **kwargs):
        '''
        单删:接口:/books/(pk)/
        群删:接口/books/
        逻辑:修改is_delete字段,修改成功代表删除成功,修改失败代表删除失败
        '''
        pk = kwargs.get('pk')
        if pk:
            pks = [pk]
        else:
            pkl = request.data
            pks = []
            for i in pkl:
                x = i.get('id')
                pks.append(x)
        try:
            rows = models.Car.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 post(self, request, *args, **kwargs):
        '''
        单增:接口/cars/(pk)/
        群增:接口/cars/
        逻辑:将数据给系列化处理,数据的类型关系many的属性是否为True
        '''
        if isinstance(request.data, dict):
            many = False
        elif isinstance(request.data, list):
            many = True
        else:
            return Response(data={'detail': '数据有误'}, status=400)
        car_ser = serializers.CarModelSerializer(data=request.data, many=many)
        car_ser.is_valid(raise_exception=True)
        car_object_or_list = car_ser.save()
        return APIResponse(results=serializers.CarModelSerializer(car_object_or_list, many=many).data)

    def patch(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 = serializers.CarModelSerializer(instance=car_instance, data=request.data, partial=True)
            car_ser.is_valid(raise_exception=True)
            car_obj = car_ser.save()
            return APIResponse(results=serializers.CarModelSerializer(car_obj).data)
        else:  # 群改
            request_data = request.data
            try:
                pks = []
                for dic in request_data:
                    pk = dic.pop('id')
                    pks.append(pk)
                    print(pks)
                car_query = models.Car.objects.filter(is_delete=False, pk__in=pks).all()
                if len(pks) != len(car_query):
                    raise Exception('pk对应的数据不存在')
            except Exception as e:
                return Response({'detail': '%s' % e}, status=400)
            car_ser = serializers.CarModelSerializer(instance=car_query, data=request_data, many=True, partial=True)
            car_ser.is_valid(raise_exception=True)
            car_list = car_ser.save()
            return APIResponse(results=serializers.CarModelSerializer(car_list, many=True).data)


class CarStoreAPIView(APIView):
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:
            car_obj = models.CarStore.objects.filter(is_delete=False, pk=pk).first()
            car_ser = serializers.CarStoreModelSerializer(car_obj)
        else:
            car_obj = models.CarStore.objects.filter(is_delete=False).all()
            car_ser = serializers.CarStoreModelSerializer(car_obj, many=True)
        return APIResponse(status=car_ser.data)

    def delete(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:
            pks = [pk]
        else:
            pkl = request.data
            pks = []
            for i in pkl:
                pk = i.get('id')
                pks.append(pk)
        try:
            rows = models.CarStore.objects.filter(is_delete=False, pk__in=pks).update(is_delete=True)
        except:
            return APIResponse(1, '数据有误')
        if rows:
            return APIResponse(0, '删除成功')
        else:
            return APIResponse(1, '删除失败')

    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)
        carstore_ser = serializers.CarStoreModelSerializer(data=request.data, many=many)
        carstore_ser.is_valid(raise_exception=True)
        carstore_object_or_list = carstore_ser.save()
        return APIResponse(status=serializers.CarStoreModelSerializer(carstore_object_or_list, many=many).data)

    def patch(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:
            try:
                car_store = models.CarStore.objects.filter(is_delete=False, pk=pk)
            except:
                return Response({'detail': 'pk error'}, status=400)
            car_store_ser = serializers.CarStoreModelSerializer(instance=car_store, data=request.data, partial=True)
            car_store_ser.is_valid(raise_exception=True)
            car_store_obj = car_store_ser.save()
            return APIResponse(results=serializers.CarStoreModelSerializer(car_store_obj).data)
        else:
            request_data = request.data
            try:
                pks = []
                for dic in request_data:
                    pk = dic.pop('id')
                    pks.append(pk)
                car_store_query = models.CarStore.objects.filter(is_delete=False, pk__in=pks).all()
                if len(pks) != len(car_store_query):
                    raise Exception('PK对应的数据不存在')
            except Exception as e:
                return Response({'detail': '%s' % e}, status=400)
            car_store_ser = serializers.CarStoreModelSerializer(instance=car_store_query, data=request_data, many=True,
                                                                partial=True)
            car_store_ser.is_valid(raise_exception=True)
            car_store_list = car_store_ser.save()
            return APIResponse(results=serializers.CarStoreModelSerializer(car_store_list, many=True).data)

猜你喜欢

转载自www.cnblogs.com/mqhpy/p/12115990.html
74
今日推荐