DJANGO REST FRAMEWORK 入门
-- 创建 user 应用 python3 manage.py startapp user
-- settings.py
-
INSTALLED_APPS = [
....
'rest_framework',
'user',
]
/user/views.py
from django.shortcuts import render # Create your views here. from rest_framework.viewsets import ModelViewSet from .models import User from .serializers import UserModelSerializer,UserSerializer from django.http.response import JsonResponse from django.views import View from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import BasePermission class MyPermission(BasePermission): message = '必须是管理员才能访问' def has_permission(self, request, view): if request.user.user_type != 1: return False class UserViewSet(ModelViewSet): queryset = User.objects.all() serializer_class = UserModelSerializer class UserView1(View): def get(self,request, pk): # 获取单个数据 student = User.objects.get(pk=pk) # 数据转换[序列化过程] serializer = UserSerializer(instance=student) print(serializer.data) # 响应数据 return JsonResponse(serializer.data) class UserView2(View): '''使用序列化器序列化转换成多个模型数据''' def get(self,request): # 获取数据 user_list = User.objects.all() # 转换数据[序列化过程] # 如果转换多个模型对象数据,需要加上many = True serializer = UserSerializer(instance=user_list,many=True) print(serializer.data) # 响应请求 # 返回json 数据, 如果是列表,则需声明 safa = False return JsonResponse(serializer.data,safe=False) class UserView3(APIView): '''使用序列化器序列化转换成单个模型数据''' def get(self,request,pk): # 获取单个数据 user = User.objects.get(pk=pk) # 数据转换 [序列化过程] serializer = UserSerializer(instance=user) print(serializer.data) return JsonResponse(serializer.data) def put(self,request,pk): '''在更新中调用序列化器完成数据的更新操作''' user_obj = User.objects.get(pk=pk) # print(request.data) data_dict = self.__requset_to_dict(request) print(data_dict) # 实例化序列化器 serializer = UserSerializer(instance=user_obj,data=data_dict) serializer.is_valid(raise_exception=True) instance = serializer.save() print(f'update{instance}') return JsonResponse({'code':200,'msg':'update success'}) def delete(self,request,pk): '''在更新中调用序列化器完成数据的删除操作''' user = User.objects.filter(pk=pk).first() user.delete() print(f'删除{user}用户成功') return JsonResponse({'code':200, 'msg':'del success'}) @staticmethod def __requset_to_dict(request): req_data = request.data data_dict = { 'name': req_data.get('name', ''), 'age': req_data.get('age', ''), 'sex': req_data.get('sex', ''), 'phone': req_data.get('phone', ''), 'addr': req_data.get('addr', ''), } return data_dict class UserView4(View): '''使用序列化器序列化转换多个模型数据''' def get(self,request): # 获取数据 user_list = User.objects.all() # 转换数据[序列化过程] # 如果转换多个模型对象数据,则需要加上many=True serializer = UserSerializer(instance=user_list, many=True) print(serializer.data) # 序列化器转换后的数据 # 响应数据给客户端 # 返回json 数据, 如果是列表,则需要声明 safe = False return JsonResponse(serializer.data, safe=False) def post(self,request): data_dict = self.__request_to_dict(request) '''在客户端提交数据时,对数据进行验证''' serializers = UserSerializer(data=data_dict) result = serializers.is_valid(raise_exception=True) print(f"验证结果为:{result}") # 获取验证的错误信息 if not result: print('错误信息:%s'%serializers.error_messages) # save 表示让序列化器开始执行反序列化代码, create 和 update 的代码 user = serializers.save() print(f'新建用户{ user }') return JsonResponse({'code':200, 'msg':'add success'}) @staticmethod def __request_to_dict(request): req_data = request.POST data_dict = { 'name': req_data.get('name', ''), 'age': req_data.get('age', ''), 'sex': req_data.get('sex', ''), 'phone': req_data.get('phone', ''), 'addr': req_data.get('addr', ''), } return data_dict
# 创建 user文件夹下创建serializers.py
from rest_framework import serializers from user.models import User # 创建序列化器,视图中被调用 class UserModelSerializer(serializers.ModelSerializer): class Meta: model = User fields = "__all__" # def create(self, validated_data): # return User.objects.create(**validated_data) # def about_name(value): # if 'drf' in value.lower(): # raise serializers.ValidationError('name 不能是drf') # # # class UserSerializer(serializers.Serializer): # # """用户信息序列化器""" # # 1. 需要进行数据转换的字段 # # # ''' # 声明序列化器,所有的序列化器都要直接或者间接继承于 Serializer # 其中, ModelSerializer 是 Serializer 的子类, ModelSerializer 在Serializer的基础上进行了代码简化 # ''' # id = serializers.IntegerField(read_only=True) # name = serializers.CharField(validators=[about_name]) # age = serializers.IntegerField() # sex = serializers.BooleanField() # phone = serializers.CharField(read_only=True) # addr = serializers.CharField(read_only=True) # # def validate_name(self, value): # if 'niko' in value.lower(): # raise serializers.ValidationError("name不能为niko",code=400) # return value # # def validate(self, attrs): # age = attrs['age'] # sex = attrs['sex'] # # # if age < sex: # # raise serializers.ValidationError('age 不能比 sex小') # return attrs class UserSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) name = serializers.CharField() age = serializers.IntegerField() sex = serializers.BooleanField() phone = serializers.CharField(read_only=True) addr = serializers.CharField(read_only=True) def create(self, validated_data): return User.objects.create(**validated_data) def update(self, instance, validated_data): '''更新,instance为要更新的对象实例''' instance.name = validated_data.get('name',instance.name) instance.age = validated_data.get('age',instance.age) instance.sex = validated_data.get('sex',instance.sex) instance.phone = validated_data.get('phone',instance.phone) instance.addr = validated_data.get('addr',instance.addr) instance.save() return instance class UserModelSerializers(serializers.ModelSerializer): class Meta: model = User fields = '__all__' extra_kwargs = { 'age' : {'max_value':200, 'required':True} }
from django.db import models # Create your models here. class User(models.Model): # 模型字段 name = models.CharField(max_length=10, verbose_name="姓名") sex = models.BooleanField(default=1, verbose_name="性别") age = models.IntegerField(verbose_name="年龄") phone = models.CharField(max_length=20, null=True, verbose_name="电话") addr = models.CharField(max_length=100,null=True,verbose_name="地址") class Meta: db_table = "tb_user" verbose_name = "用户" verbose_name_plural = verbose_name class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32) user_type_choices = [ (1,'普通用户'), (2,'VIP用户'), (3,'SVIP用户') ] user_type = models.IntegerField(choices=user_type_choices,default=0)

浙公网安备 33010602011771号