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属性使用) *****
"""