• 接口初始练习


    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)
    
    
  • 相关阅读:
    python之简单窗口
    hdu1237简单计算器
    BST二叉查找树的实现与操作
    huffman树入门
    hdu2043密码
    hdu1870愚人节的礼物
    hdu 2085 核反应堆
    hdu 2066 一个人的旅行(Dijkstra求最短路问题)
    hdu 2063 过山车 (二分匹配)
    hdu 2067 小兔的棋盘(Catalan数)
  • 原文地址:https://www.cnblogs.com/shaozheng/p/12120462.html
Copyright © 2020-2023  润新知