• day69


    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属性使用)  *****
    """
  • 相关阅读:
    让VS2010/VS2012添加新类时自动添加public关键字
    Unity+MVC:实现IDependencyResolver接口需要注意的地方
    ISAPI_Rewrite引起的IIS应用程序池崩溃(fatal communication error)
    梦想成现实:用xUnit.net在单元测试中实现构造函数依赖注入
    Entity Framework 实践系列 —— 搞好关系 单相思(单向一对一,onetoone)
    在ASP.NET中运行控制台程序
    Entity Framework 实践系列 —— 搞好关系 两情相悦(双向一对一)
    程序员,用NuGet管理好你的包包
    想爱容易,相处难:当ASP.NET MVC爱上IoC
    操作步骤:用ildasm/ilasm修改IL代码
  • 原文地址:https://www.cnblogs.com/bigbox/p/12657561.html
Copyright © 2020-2023  润新知