Django-DRF和序列化器
Django-DRF和序列化器

Django-DRF和序列化器

DRF(Django REST framework),算是一个Django的补丁?总之如果想用好Django满足一些更为便捷的开发功能,DRF就不可少。

安装指令pip install djangorestframework,我们在之前的环境重构时候就已经安装了。不过需要注意的是,如果我们想要用起来,还需要在mycrm/settings.py下把rest_framework加入app:

在Django原生的开发里,“模型”(model)把数据存到了数据库中,但需要给前端返回JSON数据或从前端接收JSON数据写入数据库,Django原生功能不太够用。 Django REST framework 里通过序列化器(serializer)来做这件事。 简单来说,serializers 就是数据模型和JSON之间的桥梁: 把模型对象转成JSON(序列化,输出) 把JSON数据解析成模型对象(反序列化,输入)。

Serializers

序列化器可以将原有的模型转换成JSON,我们在Customers下新建一个serializers.py的文件,用来写对应的序列化器。

from rest_framework import serializers
from .models import Customer

class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = '__all__'

这儿有两个问题,一是类里面套了另一个类,为什么?因为 Django 认为:Meta → 描述“配置/约束”。类主体 → 描述“数据结构/逻辑”,算是一种独特的写法,如果不想用,扔到__init__里面应该是类似效果。

二是fields参数的含义,这个是指定需要序列化的字段,比如model里某些字段不想序列化,那就不要写进来。如果我们只想处理id、name和email,那就fields = ['id','name','email']即可。当然,也可以写exclude = [除了id、name和email的其他字段],能起到同样的效果。

此外,我们也可以通过read_only_fieldsextra_kwargs来配置每个字段规则,后面用到再说,不再赘述。

获取当前用户信息

此处我们增加一个获取当前用户信息的功能,以测试序列化的特点。

# customer/serializers
# 加入这样一个类
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username', 'email']

# customer/views
# 加入一个类视图
class CurrentUserAPIView(APIView):
    permission_classes = [IsAuthenticated]
    # 确保只有登录的用户能访问
    def get(self, request):
        # 使用当前用户数据序列化
        serializer = UserSerializer(request.user)
        return Response(serializer.data)

# customer/urls
# 路由配置
urlpatterns = [
    path("register/", views.register_view, name="register"),
    path("login/", views.login_view, name="login"),
    path("logout/", views.logout_view, name="logout"),
    path("home/", views.home_view, name="home"),
    path('api/current-user/', CurrentUserAPIView.as_view(), name='current_user'),
]

这样,就可以通过http://127.0.0.1:8000/api/current-user/来访问这个接口,看到当前登录用户的信息了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注