day69

爱⌒轻易说出口 提交于 2020-04-08 04:35:46

1.自定义respose类

1.respose源码分析   reponse参数

class Response(SimpleTemplateResponse):
    """
    An HttpResponse that allows its data to be rendered into
    arbitrary media types.
    """

    def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):

2.自定义respose类,重写repose     重写父类方法

from rest_framework.response import Response
'''
def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
'''

class APIResponse(Response):
    def __init__(self, status=0, msg='ok', http_status=None, headers=None, exception=False, **kwargs):
        # 将外界传入的数据状态码、状态信息以及其他所有额外存储在kwargs中的信息,都格式化成data数据
        data = {
            'status': status,
            'msg': msg
        }
        # 在外界数据可以用result和results来存储
        if kwargs:
            data.update(kwargs)

        super().__init__(data=data, status=http_status, headers=headers, exception=exception)

3.使用

class CarAPIView(APIView):
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:
            try:
                car_obj = models.Car.objects.get(pk=pk)
                car_serializer = serializers.CarModelSerializer(car_obj, many=False)
                # return Response({
                #     'status': 0,
                #     'msg': 'ok',
                #     'result': car_serializer.data
                # })
                return APIResponse(result=car_serializer.data)
            except:
                # return Response(
                #     data={
                #         'status': 1,
                #         'msg': 'pk error'
                #     },
                #     status=status.HTTP_400_BAD_REQUEST,
                #     exception=True
                # )
                return APIResponse(status=1, msg='pk error', http_status=400, exception=True)

        else:
            car_queryset = models.Car.objects.all()
            car_serializer = serializers.CarModelSerializer(car_queryset, many=True)
            # return Response({
            #         'status': 0,
            #         'msg': 'ok',
            #         'results': car_serializer.data,
            #     })
            return APIResponse(results=car_serializer.data)

2.数据库orm补充(重点)   

"""
外键位置:
1)一对多:ForeignKey必须放在多的一方,书与出版社,外键应该放在书表
2)多对多:ManyToManyField放在任何一方都可以,因为会创建关系表,在关系表中用两个外键分别关联两个表
3)一对一:OneToOneField放在依赖的表,作者与作者详情,放在详情表,OneToOneField会被转换为 外键 + 唯一约束
"""

"""
ORM关系Field:
ForeignKey可以设置related_name, db_constraint, on_delete
OneToOneField可以设置related_name, db_constraint, on_delete
ManyToManyField只能设置related_name, db_constraint
    不能设置on_delete的原因:不管是关联的A表,还是B表,数据修改,都会影响到关系表(默认级联),
    如果想控制,只能自定义关系表,在关系表的两个外键分别设置on_delete
"""

"""
参数含义
related_name:表之间反向访问的名字,默认是 表名小写|表名小写_set
db_constraint:表之间的关联关系,默认为True,代表关联,设置False,可以提高增删改的效率,且不影响查等其他操作
on_delete:在django 1.x下默认是CASCADE,在django 2.x下必须手动明确
"""

"""
表关系:
作者没,作者详情一定没:CASCADE  *****
作者没,书还是该作者出的:DO_NOTHING
部门们,部门内的员工全部进入未分组部门:SET_DEFAULT (需要配合default属性使用)  
部门们,部门内的员工部门外键字段设置为空:SET_NULL (需要配合null=True属性使用)  *****
"""

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!