drf开发

发布时间 2023-07-27 17:46:03作者: MyKai

DRF开发模式

  • CBF
  • CBV (from django.views import View)
  • REstfulApi

DRF

安装

pip install djangorestframework
  • 安装django-filter
pip install django-filter
  • jwt
pip install djangorestframework
pip install djangorestframework-simplejwt
pip install django-cors-headers

调用新的view

from rest_framework.views import APIView

继承自CBV的view,初始化:认证,权限,限流。

重写了request方法,让request.data拿到的数据一致

post方法:request.data

get方法:request.query_params

序列化对象

from rest_framework import serializers
Serializer
class BookSerial(serializers.Serializer):
    name = serializers.CharField(max_length=32)
    price = serializers.IntegerField()
    pub_date = serializers.DateField()

校验应该和数据库规则一致

ModelSerializer

自动创建序列化器

引入参数:model,fields必传

class DictSers(serializers.ModelSerializer):
    # date=serializers.DateField(source="createdate")  自定义fields 新创建并复制一个字段
    class Meta:
        model=models.DictModel
        fields="__all__" # 所有字段 
        # fields=["id","name"]
        excude=[] #排除这些字段的其他字段,与fields互斥

    
  • model

接口操作

新增
        # 序列化对象 传入data
        sers=BookSerial(data=requests.data)
        # 校验数据 返回一个布尔值,所有正确才返回True validated_data序列化数据
        if sers.is_valid():
            models.BookModel.objects.create(**sers.validated_data)
            return utils.HttPResponceSuccess("新增成功")
        else:
            #返回错误
            return utils.HttPErrorValue(sers.errors)
查询list
book_lists = models.BookModel.objects.all()
# 序列化对象  instance序列化对象,many是否对个对象
jsondata = BookSerial(instance=book_lists, many=True)
return utils.HttPResponceSuccess(jsondata.data)
字段重新命名
date = serializers.DateField(source='pub_date') #source(源字段)

save操作

class sers():

	********
    def create(self,validated_data):
        new_dicts=models.DictModel.objects.create(**self.validated_data)
        # !!!需要返回值
        return new_dicts
        
instance:sers.save() 调用序列化时的create方法
instance+data:sers.save() 调用序列化时的update方法
更新
sersid = requests.data['id']	
models.DictModel.objects.filter(id=sersid).update(**requests.data)
return utils.HttPResponceSuccess("更新成功")
查单个详情
 sersid=requests.data["id"]
 objdata=models.DictModel.objects.get(id=sersid)
 objDetail=DictSers(instance=objdata,many=False)
 return  utils.HttPResponceSuccess(objDetail.data)
 获取get的另一种方法:
 requests.query_params.get("id")
 删
 sersid=requests.data["id"]
 models.DictModel.objects.get(id=sersid).delete()
 return utils.HttPResponceSuccess("删除成功")

新增,查询所有

查询所有
def get(self, requests):
    dicts = models.DictModel.objects.all()
    sers = DictSers(instance=dicts, many=True)
    return utils.HttPResponceSuccess(sers.data)
增加
def post(self, requests):
    sers = DictSers(data=requests.data)
    if sers.is_valid():
        sers.save()
        return utils.HttPResponceSuccess("新增成功")
    else:
        return utils.HttPErrorValue(sers.errors)

GenericAPIView视图类 继承至APIView

  • 导入
from rest_framework.generics import  GenericAPIView

viewSet: 重新构建分发机制

from rest_framework.viewsets import ModelViewSet

class UserView(ModelViewSet):
    queryset = UserModel.objects.all()
    serializer_class = UserSer
ViewSet路由组件
route=routers.DefaultRouter(trailing_slash=False)
#trailing_slash=False 末尾不加/
route.register("user",views.UserView)
urlpatterns=[
]
urlpatterns+=route.urls