温顾练习的保存
""" drf的四种开发方式,以及 分页、限流、认证、排序、权限等等 以下部分字段不一定存在,只是都练习到写上"""
# 一、函数式编程
@api_view(["GET", "POST"])
def test_list(request):
"""
获取数据
"""
if request.method == "GET":
query_set = Student.objects.all()
s = StudetSerializer(query_set, many=True)
return JsonResponse({"datas": s.data, "status": status.HTTP_200_OK})
elif request.method == "POST":
s = StudetSerializer(data=request.data, partial=True) # partial 非必传部分更新,定义5个,传3个,只更新3个
if s.is_valid():
s.save(teacher="12321") # 前端不传的字段,查到后可通过这种去传入
return JsonResponse({"datas": s.data, "status": status.HTTP_200_OK})
return JsonResponse({"datas": s.errors, "status": status.HTTP_400_BAD_REQUEST})
elif request.method == "PUT":
student = Student.objects.get(id=1)
s = StudetSerializer(instance=student, data=request.data)
if s.is_valid:
s.save()
# 二、类编程
class TestList(APIView):
def get(self, request):
# 无新知识,跟上面一致
pass
def post(self, request):
# 无新知识,跟上面一致
pass
# 三、通用视图类
class StudentsViewsetss(generics.ListCreateAPIView):
# generics.CreateAPIView 新建 post
# generics.DestroyAPIView 删除 delete
# generics.UpdateAPIView 更新 put
# generics.RetrieveUpdateAPIView 获取、更新、删除操作的VIEW
# queryset、serializer_class等的名称是固定的,哪些不满足,看看源码可以重写方法
queryset = Student.objects.all()
serializer_class = StudetSerializer
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True) # raise_exception是否抛出异常,一般都是true
print(serializer.is_valid(raise_exception=True))
# 以下为逻辑段
if "flag" in request.data:
self.perform_create(serializer)
return Response("保存成功", status=status.HTTP_201_CREATED)
else:
return Response("保存失败", status=status.HTTP_400_BAD_REQUEST)
# 四、drf的视图集viewset
class TestViewSet(viewsets.ModelViewSet):
queryset = Student.objects.filter(id=1)
serializer_class = StudetSerializer
def perform_create(self, serializer):
serializer.save(teacher="123")
"""
一、 此种写法比较麻烦
get:请求方式
list: ModelViewSet->ListModelMixin->list方法
重要!!!!路由写法, url(r'viewsets/$', TestViewSet.as_view({
"get": "list",
"post": "create",
"put": "update",
"delete": "destroy"
}), name="viewsets-list"),
二、 routers (用这种)
router.register(r'students', TestViewSet, basename="test")
"""
# method_decorator的作用是为函数视图装饰器补充第一个self参数,以适配类视图方法, method_decorator 是将函数装饰器转换成方法装饰器。
@method_decorator(csrf_exempt, name="dispatch") # post, 一种取消csrf
class LogView(APIView):
@csrf_exempt # 二种取消csrf
def get(self, request):
# django内置密码加密
pwd = request.GET.get("pwd")
# 加密算法,默认pbkdf2_sha256,hasher参数指定算法
make = make_password(pwd)
log.info("输出加密密码:{}".format(make))
if check_password(pwd, make):
log.info("校验成功")
return JsonResponse(data={})
class ModelsView(APIView):
def get(self, request):
# student = Student.objects.create(name="123", sex="女", number="456123")
# techer = Teacher.objects.create(techer_name="www")
sql = Student.objects.filter(name="123").query # 返回原始sql
'''
update_or_create: 更新或新建
defaults: 新建参数
**kwargs: 匹配字段
'''
# Teacher.objects.update_or_create(defaults={},techer_name="www")
return JsonResponse(data={})
暑期编程PK赛
得CSDN机械键盘等精美礼品!


