首页 > 技术文章 > 一.2.序列化使用之用户资源功能app

dbslinux 2020-06-11 07:54 原文

1.环境准备:
(1).新建功能app: (python36env) [vagrant@CentOS7 devops]$ python manage.py startapp users ---建议以后用命令行建不要用pycharm (python36env) [vagrant@CentOS7 devops]$ mv users apps/ (python36env) [vagrant@CentOS7 devops]$ ls apps devops logs manage.py __pycache__
(2).激活app:
INSTALLED_APPS = [.....
    'idcs.apps.IdcsConfig',
'users.apps.UsersConfig'
]

(3).apps/ursl.py---注意以后的url都如下这样写,而不用再单独建app的urls文件了,项目就只有此一urls文件,所有app的url都注册到路由DefaultRouter()中即可from django.conf.urls import include, url

from django.contrib import admin
from rest_framework.routers import DefaultRouter
from idcs.views import IdcViewset_v7

route = DefaultRouter()
route.register("idcs", IdcViewset_v7, basename="idcs")
route.register("users", UserViewset, basename="users")
urlpatterns = [
url(r'^', include(route.urls)) ---->把route中的app的路由转换成django的路由
]


(4).apps/idcs/views.py中:
##########################  版本七   ############################
from rest_framework import viewsets
class IdcViewset_v7(viewsets.ModelViewSet):
    queryset = Idc.objects.all()
    serializer_class = IdcSerializer

(python36env) [vagrant@CentOS7 devops]$ python manage.py runserver 0.0.0.0:8000 运行后效果如下

2.写users用户资源功能:

(1)用户模型django内置已写,所以这里我不写了

(python36env) [vagrant@CentOS7 devops]$ python manage.py dbshell

MariaDB [devops]> desc auth_user;  --查看有哪些字段

(2)写用户资源的序列化文件users/serializers.py

from rest_framework import serializers

#新建序列化类并继承序列化模块中的序列化类
class UserSerializer(serializers.Serializer):
    '''
    用户序列化类
    '''
    #开始写给前端返回的字段--返回给前端调用者的数据类型
    username = serializers.CharField()
    email = serializers.EmailField()

(3)写用户资源的viewset视图,注意对一个资源一般有5种操作(get,put,push,delete,)'''注意对一个资源一般有如下5种操作:所以这里要考虑这个UserViewset类要实现哪几个操作(如果用户添加,删除都要则如下5种都用),但是

这里我实现的是只能获取不能修改的功能,所以这个类只需继承readonly这个viewset类即可
get:
list
get 单个对象
create
update
delete
'''
users/views.py中:
from django.shortcuts import render
from rest_framework import viewsets
#from django.contrib.auth.models import User 以后建议换成下面这种写法
from django.contrib.auth import get_user_model
from .serializers import UserSerializer

User = get_user_model()
class UserViewset(viewsets.ReadOnlyModelViewSet):
    '''
    这个用户资源的viewset会给外面暴露两个接口retrieve和list
    retrieve:
        返回指定用户信息对象--单个对象的字段是在用户序列化类serializers.py中定义
     list:
        返回用户列表--列表的字段的字段是在用户序列化类serializers.py中定义
    '''
    #1.指定queryset
    queryset = User.objects.all()
    #2.指定序列化类
    serializer_class = UserSerializer

(4)把这个用户资源的viewset注册到router中devops/urls.py中:
from django.conf.urls import include, url
from django.contrib import admin
from rest_framework.routers import DefaultRouter
from idcs.views import IdcViewset
from apps.users.views import UserViewset

route = DefaultRouter()
route.register("idcs", IdcViewset, basename="idcs")
#注册时三个参数:资源定位符,类,别名
route.register("users", UserViewset, basename="users")
urlpatterns = [
    url(r'^', include(route.urls))
]

 

(python36env) [vagrant@CentOS7 devops]$ python manage.py makemigrations

(python36env) [vagrant@CentOS7 devops]$ python manage.py migrate

 (5)为测试,给它来点数据:

(python36env) [vagrant@CentOS7 devops]$ python manage.py shell  通过django的shell创建用户

In [3]: from django.contrib.auth.models import User                                                   

In [4]: def create_user(name): 
   ...:     for i in range(1,20): 
   ...:         username = "{}-{}".format(name,i) 
   ...:         User.objects.create_user(username, "{}@51reboot.com".format(username),"1234567") 
In [11]: create_user("rock") 

In [12]: create_user("panda")

In [13]: create_user("wd")

In [14]: create_user("pc")

刷新后如下图,拿到数据了:

IdcViewset

推荐阅读