drfwork

扫码查看

作业

'''
response.py
'''
from rest_framework.response import Response

class APIResponse(Response):
    def __init__(self,status=0,msg='ok',results=None,http_status=None,
                 headers=None,exception=False,content_type=None,**kwargs):
        data={
            'status':status,
            'msg':msg,
        }
        if results is not None:
            data['results']=results

        data.update(**kwargs)
        super().__init__(data=data,status=http_status,headers=headers,exception=exception,content_type=content_type)
'''
models,py
'''
from django.db import models

# Create your models here.

class BaseModel(models.Model):
    is_delete = models.BooleanField(default=False)
    create_time = models.DateTimeField(auto_now_add=True)
    class Meta:
        abstract=True

class Car(BaseModel):
    CHOICE_COLOR=(
        (1,'红色'),
        (2,'白色'),
        (2,'蓝色'),
    )
    name=models.CharField(max_length=64,verbose_name='车名',unique=True)
    price=models.DecimalField(max_digits=5,decimal_places=2,verbose_name='价格')
    color=models.IntegerField(choices=CHOICE_COLOR,default=1,verbose_name='颜色')
    img=models.ImageField(upload_to='img',default='img/111.jpg')
    brand=models.CharField(max_length=64,verbose_name='品牌')
    shops=models.ForeignKey(to='Shop',db_constraint=False,related_name='cars')
    sponsors=models.ForeignKey(to='Sponsor',db_constraint=False,related_name='cars')

    @property
    def info(self):
        return {
            'car_color':self.get_color_display(),
            'shop_name':self.shops.name,
            'sponsors_name':self.sponsors.name,
        }
    class Meta:
        verbose_name_plural='汽车表'

class Shop(BaseModel):

    name=models.CharField(max_length=64,verbose_name='商家名',unique=True)
    class Meta:
            verbose_name_plural='商家表'

class Sponsor(BaseModel):
    name=models.CharField(max_length=64,verbose_name='赞助商')
    class Meta:
        verbose_name_plural='赞助商表'

class SponsorDetail(BaseModel):
    address=models.CharField(max_length=64,verbose_name='地址')
    phone=models.CharField(max_length=64,verbose_name='手机号')
    sponsor=models.OneToOneField(to=Sponsor,related_name='detail',db_constraint=False)
    class Meta:
            verbose_name_plural='赞助商信息'
'''
seriailzer.py
'''
from rest_framework import serializers
from api import models

class CarModelSerializer(serializers.ModelSerializer):


    class Meta:
        model = models.Car
        fields = ['name','price','brand','info','shops','sponsors']
        extra_kwargs = {
        'sponsors':{
            'write_only':True
        },
        'shops': {
            'write_only': True
        },
        }
'''
views视图
'''
from api import models
# Create your views here.


from rest_framework.views import APIView
from rest_framework.response import Response
from api import response,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()
            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 response.APIResponse(results=car_ser.data)

    def delete(self,request,*args,**kwargs):
        pk = kwargs.get('pk')
        if pk:
            pks=[pk]
        else:
            pks = request.data
        try:
            rows = models.Car.objects.filter(is_delete=False, pk__in=pks).update(is_delete=True)
            print(rows)
        except:
            return response.APIResponse(status=1,msg='数据有误')
        if rows:
            return response.APIResponse(status=0,msg='删除成功')

    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)
        car_ser = serializer.CarModelSerializer(data=request.data,many=many)
        car_ser.is_valid(raise_exception=True)
        car_obj_or_list = car_ser.save()
        return response.APIResponse(results=serializer.CarModelSerializer(car_obj_or_list,many=many).data)


    def put(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 = serializer.CarModelSerializer(isinstance=car_instance,data=request.data)
            car_ser.is_valid(raise_exception=True)
            car_obj = car_ser.save()
            return response.APIResponse(results=serializer.CarModelSerializer(car_obj).data)
        else:
            request_data = request.data
            try:
                pks = []
                for dic in request_data:
                    pk = dic.pop('pk')  # 解决分析1,没有pk pop方法就会抛异常
                    pks.append(pk)

                book_query = models.Car.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 = serializer.CarModelSerializer(instance=book_query, data=request_data, many=True)
            book_ser.is_valid(raise_exception=True)
            book_list = book_ser.save()
            return response.APIResponse(results=serializer.CarModelSerializer(book_list, many=True).data)
12-13 20:11
查看更多