django中的重量级框架 django-rest-framework

本文介绍了如何使用django-rest-framework来构建RESTful API,包括安装、配置、模型序列化、视图集的创建以及URL路由的注册。重点讲解了serializers的使用,以及在restframework中处理request和response的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

django-rest-framework

使用命令安装:

pip install djangorestframework

配置restframework

在settings中的INSTALLED_APPS里添加'rest_framework',
添加restframework的配置
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.AllowAny'
]

}

在django中以resful规则写框架时的难点就在于模型的序列化,在rest-frame-work中提供了serializers模块 进行模型序列化

使用django-rest-framework建立一个简单的服务器:

  1. 在应用中创建一个serializers.py的文件,用来存放序列化器相关的代码
    创建一个serializer类,继承自HyperlinkedModelSerializer,
    然后在serializer类中指定class Meta,
    需要包含的属性有model(模型)和fields(需要序列化的字段名),fields需要是一个列表或元组

    class Model_NameSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = ModelName
            fields = ['url', 'id', 'name', ]
    
  2. 在views.py中创建视图集合Mode_NameViewset类,继承自ModelViewSet
    在类中指定queryset(查询结果集)和serializer_class(序列化器类)

    class Mode_NameViewset(ModelViewSet):
        queryset = Model_name.objects.all()
        serializer_class = Model_NameSerializer
    

    在viewset中直接集成了对模型对象的增删改查(单个查询+列表查询)

  3. 在urls中调用DefaultRouter方法创建router
    使用创建的router注册路由,
    在项目中的urls.py中的urlpatterns中注册router

    # 应用中的url文件里添加:app.urls
    router = DefaultRouter()
    router.register('url_name', Mode_NameViewset)
    
    # 项目中的uurl文件里添加:django_project.urls
    urlpatterns = [
    	...
    	re_path('url_name/', include(router.urls)),
    ]
    

记得在settings.py中添加restframework相关配置

serializer

序列化器

serializers.Serializer
	原生序列化
	需要手动编写每个序列化的字段
	需要手动实现对象的创建和更新
	手动序列化(
	在serializers..py中创建继承serializers.Serializer的类,
	然后创建和models.py中对应模型所拥有的相同属性,
	使用serializers.字段属性[Charfield等、和models中相同即可]。
	然后创建crate和update方法;可以在类名上使用alt+enter快速创建,
	create方法需要返回类名.objects.create(**validated_data),update里则需要根据字段名获取对应属性:instance.p_name = validated_data.get('p_name', instance.p_name),
	若获取不到返回默认值,需要的属性获取完毕之后保存返回instance实例即可
	调用Serializer(实例),则会返回改实例对应的json字符串
	)
serializers.ModelSerializer
	模型序列化
	在classMeta中定义model模型和field字段属性即可
	指定字段
		fields
			获取列表中声明的属性
		exclude
			剔除列表中声明的属性
serializers.HyperLinkedSerializer
	序列化模型,并添加超链接
	带超链接的模型序列化
	在classMeta中定义model模型和field字段属性即可
	字段扩充了url

使用StudentSerializer来对查询结果集转化为json:

student_serializer = StudentSerializers(students, many=True)  # 添加many属性
return JsonResponse(data=student_serializer.data, safe=False)  # 返回添加safe属性

restframework中的双R,request和response

Request
	rest_framework重新定义的一个类
	扩充django中的request
	_request就是django中的request
	data
		POST、PUT、PATCH请求方法的参数
	user
		登录的用户
	auth
		用户的令牌
		
Response
	HttpResponse的子类
status
	常量类
View的包装
	@api_view
		通过使用装饰器的形式来修改既有视图函数
		可以添加请求控制
	APIView
		继承自View
		封装了一些函数
		as_view的重写
			dispatch
		dispatch重写
			初始化request
			构建新的request
			使用django中的request和一些过滤类,生成了rest_framework中的request
			初始化各种工具
				认证
					认证成功返回的是一个元祖
					第一个元素:用户 user
					第二个元素:令牌 auth、token
				权限
					所有权限都满足才正常
				节流
					判断请求频率是否被允许,若不允许则等待
			csrf_exempt  在view中返回时调用,添加了csrf全局豁免
添加格式化,添加结尾标识,返回不同格式

APIView的子类和方法:

generics模块  # 封装好的APIView,都是通过多继承来实现的
	GenericAPIView  # 主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。
	CreateAPIView  # 创建的类视图
	ListAPIView  # 列表的类视图
	RetrieveAPIView  # 查询单个的类视图
	DestroyAPIView  # 删除数据的类视图
	UpdateAPIView  # 更新数据的类视图
	ListCreateAPIView  # 获取列表数据,创建数据的类视图
	RetrieveUpdateAPIView  # 获取单个数据,更新单个数据的类视图
	RetrieveDestroyAPIView  # 获取单个数据,删除单个数据的类视图
	RetrieveUpdateDestroyAPIView  # 获取单个数据,更新、删除单个数据的类视图
	
mixins模块   # 存放一些增删改查的一些类  
	CreateModelMixin  # 创建
	ListModelMixin  # 查询多个
	RetrieveModelMixin  # 查询单个
	DestroyModelMixin  # 删除
	UpdateModelMixin  # 更新
	
viewsets模块
	ViewSetMixin  # 重写了as_view
	ViewSet  # 默认什么都不支持,需要自己手动实现
	GenericViewSet  # 继承自ViewSetMixin和generics.GenericAPIView
	ReadOnlyModelViewSet  # 只读的模型的视图集合
	ModelViewSet  # 继承自mixins中的增删改查类和GenericViewSet ,集成了上述的所有方法

GenericAPIView

增加了模型的获取操作:
get_queryset
get_object
	lookup_field  默认pk,可以通过赋值更改
get_serializer
	获取序列化实例
get_serializer_class
	获取序列化类
get_serializer_context
	获取序列化上下文内容
filter_queryset
	对查询结果集进行过滤
paginator
	分页器,使用@propety定义成了一个属性
paginate_queryset
	对查询结果集进行分页

级联数据的处理

ex:

人和地址
人的操作简单
地址的操作也简单
	每个人只能管理自己的地址
	获取自己的
		get_queryset根据用户自己来获取
		用户获取通过认证实现
		用户状态使用权限实现
	增加
		post处理的时候绑定用户
	修改
		双重认证
		确认地址是我们自己的
		确认用户登录状态和权限
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值