Django继承drf的user模型的demo

1.安装虚拟环境

#mkvirtualenv drfdemo -p python3
#pip install django
#pip install djangorestframework
#pip install pymysql

2.创建项目

django-admin startproject myuser

3.添加drf应用

settings.pyINSTALLED_APPS中添加'rest_framework'

INSTALLED_APPS = [

    ...

    'rest_framework',

 

]

4.创建数据库

 create database myuser;

5.修改项目数据库连接配置

settings.py配置文件中设置mysql的账号密码

DATABASES = {

    # 'default': {

    #     'ENGINE': 'django.db.backends.sqlite3',

    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

    # }

    'default': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': "myuser",

        "HOST": "127.0.0.1",

        "PORT": 3306,

        "USER": "root",

        "PASSWORD": "123456",

    },

}

6.主引用中__init__.py设置使用pymysql作为数据库驱动

import pymysql

pymysql.install_as_MySQLdb()

7.修改mysql会遇到的两个问题:

(1)'mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__

 

    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

 

  \lib\site-packages\django\db\backends\mysql\base.py 里面进行注释

 

 

 

(2)query = query.decode(errors='replace')

 

AttributeError: 'str' object has no attribute 'decode'

 

backends/mysql/operations.py146行里面新增一个行代码:

 

query = query.encode()

8.创建app

python manage.py startapp userinfo

9.添加userinfo应用(代码修改为)

INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

 

    'rest_framework',

    'userinfo',

]

settings添加一条user模型继承的配置:

# 继承模型的认证

AUTH_USER_MODEL = "userinfo.User"

10.编写继承drfuser模型的模型:

代码如下:

from django.contrib.auth.models import AbstractUser

from django.db import models

 

 

class User(AbstractUser):

    # 只添加手机号一个字段

    mobile = models.CharField(max_length=100)

11.总路由为:

from django.contrib import admin

from django.urls import path,include

 

urlpatterns = [

    path('admin/', admin.site.urls),

    path('user/', include("userinfo.urls")),

12.app应用下的路由为:

from rest_framework.routers import DefaultRouter

from userinfo import views

 

urlpatterns = []  # 路由列表

router = DefaultRouter()  # 可以处理视图的路由器

 

router.register('userinfo', views.UserAPIView)  # url进行注册

 

urlpatterns += router.urls  # 将路由器中的所有路由信息追加到django的路由列表中

print(urlpatterns)

13.序列化器代码:

from rest_framework import serializers

from userinfo.models import User

 

# 创建序列化器类,回头会在视图中被调用

class UserModelSerializer(serializers.ModelSerializer):

    class Meta:

        model = User

        fields = "__all__"

 

    def create(self, validated_data):

        # 调用当前模型序列化器父类的create

        user = super().create(validated_data)

        # 对密码进行加密,还可以使用 make_password

        user.set_password(user.password)

        user.save()

 

        return user

14.视图代码为:

from rest_framework.viewsets import ModelViewSet

from userinfo.models import User

from userinfo.serializers import UserModelSerializer

 

 
class UserAPIView(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserModelSerializer

15.迁移:

python manage.py makemigrations
python manage.py migrate

最后成功生成了,继承drf中的原生user模型:

 

 

16.进行增删改成测试:

可以使用:

http://127.0.0.1:8000/user/userinfo/

进行新增数据,如下:

 

可以删除数据(比如id2)

http://127.0.0.1:8000/user/userinfo/2/

 

查询全部:

http://127.0.0.1:8000/user/userinfo/

数据只剩一个(原来添加了id为1,2的两个数据)

 

更新id3 的数据:

http://127.0.0.1:8000/user/userinfo/3/

 

    {

        "id": 3,

        "password": "4142432",

        "is_superuser": false,

        "username": "three01",

        "mobile": "17644551518"

    }

 

 

最后导出相应的库文件:

# 命令:pip freeze > requirements.txt

Django==2.2.4

djangorestframework==3.10.2

PyMySQL==0.9.3

pytz==2019.2

sqlparse==0.3.0

 

这样直接继承原生的user模型的demo完成

 

posted @ 2019-02-27 21:51  pycoder_hsz  阅读(716)  评论(0编辑  收藏  举报