day 75作业

汽车image资源的群查接口

models模型类配置

from django.db import models
from django.conf import settings

'''
表关系梳理:
    - 汽车厂商与汽车:一对多
    - 汽车与赞助商:多对多
    - 赞助商与赞助商详情:一对一
'''
# 基表
class BaseModel(models.Model):
    create_time = models.DateTimeField(auto_now_add=True)
    is_delete = models.BooleanField(default=False)
    class Meta:
        abstract = True

# 汽车表
class Car(BaseModel):
    name = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=10,decimal_places=2)
    image = models.ImageField(upload_to='car',default='car/default.png',verbose_name='汽车图片')

    brands = models.ForeignKey(to='Brand',related_name='cars',db_constraint=False,on_delete=models.DO_NOTHING)
    sponsors = models.ManyToManyField(to='Sponsor',db_constraint=False,related_name='cars')

    class Meta:
        verbose_name_plural = "汽车表"

    def __str__(self):
        return self.name

    @property
    def img(self):
        return '%s%s%s' % (settings.BASE_URL, settings.MEDIA_URL, self.img)

    @property
    def brands_info(self):
        return {
            'name':self.brands.name,
            'address':self.brands.address
        }

    @property
    def sponsors_list(self):
        sponsors_list_temp = []
        sponsors = self.sponsors.all()
        for sponsor in sponsors:
            sponsor_dict = {'name':sponsor.name}
            try:
                sponsor_dict['phone'] = sponsor.detail.phone
            except:
                sponsor_dict['phone'] = '无'

            sponsors_list_temp.append(sponsor_dict)
        return sponsors_list_temp

# 汽车厂商表
class Brand(BaseModel):
    name = models.CharField(max_length=255)
    address = models.CharField(max_length=255)

# 赞助商表
class Sponsor(BaseModel):
    name = models.CharField(max_length=255)

# 赞助商详情表
class Sponsor_Detail(BaseModel):
    phone = models.CharField(max_length=11)
    sponsor = models.OneToOneField(to='Sponsor',db_constraint=False,on_delete=models.CASCADE,related_name='detail')

settings配置media

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')

路由层配置media

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/', include('api.urls')),
    url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}),
]
  • 执行数据库迁移命令
  • 创建超级用户
  • 登录django-admin后台
  • 修改汽车表信息,上传汽车图片

群查接口

路由层

url(r'^v6/cars/$',views.CarListAPIView.as_view())

视图层

# 作业,单独完成群查接口
from rest_framework.generics import ListAPIView
class CarListAPIView(ListAPIView):
    queryset = models.Car.objects.filter(is_delete=False).all()
    serializer_class = serializer.CarModelSerializer

序列化类


from rest_framework import serializers
from api import models

class CarListSerializer(serializers.ListSerializer):
    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 = CarListSerializer
        model = models.Car
        fields = ['name','price','img','brands','sponsors','brands_info','sponsors_list']
        extra_kwargs = {
            'img':{
              'read_only':True
            },
            'brands':{
                'write_only':True,
            },
            'sponsors':{
                'write_only': True
            }
        }

汽车资源的单查,群查,单增,单改,单删接口

路由配置

url(r'^v7/cars/$', views.ViewGenericViewSet.as_view({
        'get': 'get',
        'post': 'create',
    })),
    url(r'^v7/cars/(?P<pk>\d+)/$', views.ViewGenericViewSet.as_view({
        'get': 'get',
        'patch':'update',
        'delete':'destroy',
    })),

视图配置

# 作业2:继承GenericViewSet工具集完成汽车资源的单查,群查,单增,单改,单删接口
from rest_framework.viewsets import GenericViewSet

class ViewGenericViewSet(GenericViewSet):
    queryset = models.Car.objects.filter(is_delete=False).all()
    serializer_class = serializer.CarModelSerializer
    lookup_url_kwarg = 'pk'

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

    def perform_create(self, serializer):
        serializer.save()

    from rest_framework.settings import api_settings

    # 单查  群查
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:
            return self.retrieve(request, *args, **kwargs)
        return self.list(request, *args, **kwargs)

    # 单增,
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        # headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=201)

    # 单局部改,
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', True)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        car_obj = serializer.save()
        if getattr(instance, '_prefetched_objects_cache', None):
            instance._prefetched_objects_cache = {}
        return APIResponse(results=self.get_serializer(car_obj).data)

    
    
    # 单删接口
    def destroy(self, request, *args, **kwargs):
        car_obj = self.get_object()
        if not car_obj:
            return APIResponse(1, msg="删除失败")
        car_obj.is_delete = True
        car_obj.save()
        return APIResponse(msg="删除成功")

posted @ 2019-12-30 21:07  GeminiMp  阅读(101)  评论(0)    收藏  举报