栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Django学习-ORM数据库和Admin后台

Django学习-ORM数据库和Admin后台

目录

一、基础说明

二、创建App包

三、创建服务接口

四、Django配置数据库

4.1 Oracle数据库:

4.2 MySql数据库:

五、Django连接Oracle数据库

5.1 Django 3.X连接Oracle11g报错“ORA-00904 IDENTITY_COLUMN”

六、Django连接Mysql数据库

6.1 方案一:pymysql

6.2 方案二(推荐):mysqlclient

七、ORM映射

7.1 model=》(映射)数据库表

7.2 数据库表=》(映射)model

八、ORM之增删改查(单个数据库)

8.1 查询全部数据

8.2 按条件查询

8.3 修改单条数据

8.4 新增单条数据

8.5 删除单条数据

九、Django同时关联多个数据库

十、Django模型修改、新增及数据迁移

10.1现有模型修改、新增新模型

10.2 数据迁移

十一、Django Admin

11.1创建超级管理员

11.2 admin内注册模型(数据表)

11.3 自定义数据表显示选项

11.4 修改Admin的标题Title(标题)和Header(头部)

11.5 添加按钮及方法

11.6 权限设置

十二、Django基于Pycharm调试

十三、遇到错误


一、基础说明

Django版本:3.2.7

Oracle:11g

Django学习教程:https://code.ziqiangxuetang.com/django1.x/django-intro.html

3.0变更内容:Django 3.0 release notes | Django documentation | Django

Model字段说明参考博客:https://blog.csdn.net/weixin_37773766/article/details/80330221

推荐博客博主: 大江狗  Django基础

二、创建App包

S1:pycharm的Terminal中输入:python manage.py startapp cust_app

S2:全局文件settings.py中的INSTALLED_APPS内加入:

INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'cust_app',

]

三、创建服务接口

参考文档:https://zhuanlan.zhihu.com/p/356405945

S1:安装类库:pip install djangorestframework

S2:settings.py文件,将Django REST framework添加到INSTALLED_APPS配置中:

INSTALLED_APPS = [

    'rest_framework',

    ...]

S3:settings.py文件,将app的名称添加到INSTALLED_APPS配置

INSTALLED_APPS = [

    'cust_app.apps.CustAppConfig',

    'rest_framework',

]

S4:定义路由

在cust_app文件夹下新建urls.py文件

from django.conf.urls import url

from cust_app import views

urlpatterns = [

url(r'^api/addcust$', views.add_customer),

url(r'^api/delcust$', views.delete_customer),

url(r'^api/updatecust$', views.update_customer),

url(r'^api/querycust',views.query_customer),

url(r'api/queryall',views.query_all_customer),

]

把app的路由添加到项目的urls.py中

from django.urls import include

urlpatterns = [ 

    url(r'^', include('tutorials.urls')),]

S5:新建Api服务接口

from django.http import JsonResponse

from rest_framework import status

from rest_framework.decorators import api_view

from cust_app.models import customer

@api_view(['POST'])

def add_cust(request):

    cust_obj = customer(cust_name="张三", cust_type="游客")

    cust_obj.save()

    return JsonResponse({"message": "客户创建成功"}, status=status.HTTP_200_OK)

在Terminal下输入:

python manage.py runserver

Postman例子:

四、Django配置数据库

4.1 Oracle数据库:

DATAbaseS = {

    'default': {

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

        'NAME': '10.128.202.5/orcl',

        'USER': 'autotest',  # 登录的用户名

        'PASSWORD': 'autotest',  # 登录的密码

    }

}

4.2 MySql数据库:

DATAbaseS = {

    'default': {

        'ENGINE': 'django.db.backends.mysql',  # 数据库引擎

        'NAME': 'LRMySql',  # 数据库名

        'USER': 'root',  # 账号

        'PASSWORD': 'LR@b123456',  # 密码

        'HOST': 'localhost',  # HOST

        'POST': 3306,  # 端口

    }

}

五、Django连接Oracle数据库

5.1 Django 3.X连接Oracle11g报错“ORA-00904 IDENTITY_COLUMN”

或“ORA-02000: missing ALWAYS keyword”

主要原因:

Django新版本连Oracle11g版本冲突问题。当前只有Django 1.X版本支持Oracle11g,Django 2.X及以上支持Oracle12g。

目前Django1.X可以正常使用,但是官方不再维护和提供技术支持。

解决方案1:

参考文档:https://blog.csdn.net/weixin_44293372/article/details/106952052

S1:卸载当前高版本Django:pip uninstall django

S2:安装1.X版本:pip install Django==1.11.22

S3:urls.py内容变更,将“path”换为“url”:

from django.conf.urls import url

from django.contrib import admin

# from django.urls import path

urlpatterns = [

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

]

S3:数据库表和model之间映射,步骤参考6.1

S4:卸载当前Django1.x版本:pip uninstall django

S5:安装当前最新版本:pip install Django

解决方案2:

将Oracle升级到12.2。

(Django 3.0 正式支持 Oracle 12.2 和 18c。对 Oracle 12.1 的上游支持将于2021年7月结束。所以不确定随着Django的新版发布,Oracle的支持版本会不会相应变更?)

六、Django连接Mysql数据库

6.1 方案一:pymysql

参考文档:https://blog.csdn.net/weixin_43499626/article/details/84351572

S1:配置数据库(MySql)

DATAbaseS = {

    'default': {

        'ENGINE': 'django.db.backends.mysql',  # 数据库引擎

        'NAME': 'LRMySql',  # 数据库名

        'USER': 'root',  # 账号

        'PASSWORD': 'LR@b123456',  # 密码

        'HOST': 'localhost',  # HOST

        'POST': 3306,  # 端口

    }

}

S2:安装类库:pip3 install pymysql

S3:在全局的setting.py的同级目录的__init__.py 加入如下配置

import pymysql

pymysql.install_as_MySQLdb()

S4:在Mysql的cmd命令行内创建数据库:create database  LRMysql;

S5:在app=》models.py内创建数据类,完成7.1内容

S6:mysql的cmd命令行查看表名:

mysql> use LRMysql

Database changed

mysql> show tables;

+-------------------+

| Tables_in_lrmysql |

+-------------------+

| django_migrations |

| lr_customer       |

+-------------------+

2 rows in set (0.00 sec)

6.2 方案二(推荐):mysqlclient

S1:配置数据库(MySql),参考方案一

S2:安装mysql插件mysqlclient  pip install mysqlclient

S3:在app=》models.py内创建数据类,完成7.1内容

S4:查看数据库已存在该数据表

七、ORM映射

7.1 model=》(映射)数据库表

S1:models.py内写入数据模型class

class customer(models.Model):

    cust_id = models.CharField('用户编号', primary_key=True, max_length=40)

    cust_name = models.CharField('用户名称', max_length=30)

    cust_type = models.CharField('用户类型', max_length=10)

    # 指定表名。默认数据库表名(mysql_app_customer)

    class meta:

        db_table = "lr_customer"

S2:将models.py下的模型转换为数据表,要用命令来执行,在Terminal下输入

# 记录本次变更

python manage.py makemigrations cust_app

# 同步到数据库

python manage.py migrate cust_app

或(指定数据库):

# 如果django配置多个数据库

# 在migrations文件夹下生成记录

python manage.py makemigrations cust_app

# 默认可以不写参数

python manage.py migrate --database default

# 指定数据库进行数据映射

python manage.py migrate cust_app --database db2

S3:查看数据库,表映射成功

7.2 数据库表=》(映射)model

参考文档:django-连接Oracle数据库_害怕的萌新的博客-CSDN博客_django oracle

S1:数据库内表已经创建成功

S2:在Terminal下输入:

导入单个表

# 导入lr_account表模型至modules.py

python manage.py inspectdb lr_account > app名/models.py --database default

导入全部表

# 导入所有表模型至AAA.py

python manage.py inspectdb > app名/AAA.py

八、ORM之增删改查(单个数据库)

参考博客:Django之ORM增删改查 - birdfish - 博客园

8.1 查询全部数据

@api_view(['POST'])

def query_all_customer(request):

    cust_obj = customer.objects.all()

    cust_data = {}

    for item in cust_obj:

        cust_data[item.cust_name] = item.cust_type

    return JsonResponse({"data": cust_data},

                        status=status.HTTP_200_OK)

8.2 按条件查询

@api_view(['POST'])

def query_customer(request):

    cust_data = JSonParser().parse(request)

    cust_name = cust_data.get("name")

    cust_obj = customer.objects.filter(cust_name=cust_name)

    cust_data = {}

    for item in cust_obj:

        cust_data["name"] = item.cust_name

        cust_data["type"] = item.cust_type

    return JsonResponse({"data": cust_data},status=status.HTTP_200_OK)

8.3 修改单条数据

@api_view(['POST'])

def update_customer(request):

    cust_data = JSonParser().parse(request)

    cust_name = cust_data.get("name")

    cust_type = cust_data.get("type")

    #查询数据

    cust_obj = customer.objects.filter(cust_name=cust_name)

    # 变更数据内容

    cust_obj.update(cust_type=cust_type)

    return JsonResponse({"message": "客户{}更改客户类型成功".format(cust_name)},

                        status=status.HTTP_200_OK)

8.4 新增单条数据

@api_view(['POST'])

def add_customer(request):

    cust_data = JSonParser().parse(request)

    cust_obj = customer()

    cust_obj.cust_name = cust_data.get("name")

    cust_obj.cust_type = cust_data.get("type")

    cust_obj.save()

    return JsonResponse({"message": "客户创建成功"}, status=status.HTTP_200_OK)

8.5 删除单条数据

@api_view(['POST'])

def delete_customer(request):

    cust_data = JSonParser().parse(request)

    cust_name = cust_data.get("name")

    cust_obj = customer.objects.filter(cust_name=cust_name)

    cust_obj.delete()

    return JsonResponse({"message": "客户{}删除成功".format(cust_name)},

                        status=status.HTTP_200_OK)

九、Django同时关联多个数据库

参考文档:Django之连接多个数据库的相关配置 - huangyanpeng - 博客园

Django如何连接多个数据库实现读写分离_大江狗-CSDN博客

以MySql为例

S1:配置多个数据库

DATAbaseS = {

    'default': {

        'ENGINE': 'django.db.backends.mysql',  # 数据库引擎

        'NAME': 'LRMySql',  # 数据库名

        'USER': 'root',  # 账号

        'PASSWORD': 'LR@b123456',  # 密码

        'HOST': 'localhost',  # HOST

        'POST': 3306,  # 端口

    },

    'db2': {

        'ENGINE': 'django.db.backends.mysql',  # 数据库引擎

        'NAME': 'mysql',  # 数据库名

        'USER': 'root',  # 账号

        'PASSWORD': 'LR@b123456',  # 密码

        'HOST': 'localhost',  # HOST

        'POST': 3306,  # 端口

    }

}

S2:model.py向数据库映射,需要指定数据库标识

python manage.py makemigrations cust_app --database db2

python manage.py migrate cust_app --database db2 # 指定数据库进行数据映射

S3:对数据库操作(增删改查)时,需要指定数据库标识

from django.http import JsonResponse

from rest_framework import status

from rest_framework.decorators import api_view

from rest_framework.parsers import JSONParser

from mysqlclient_app.models import customer

# Create your views here.

@api_view(["POST"])

def query_all(request):

    """

    查询全部信息

    :param request:

    :return:

    """

    dic_data = {}

    # using("db2"):选择此查询集应针对哪个数据库执行

    cust_obj = customer.objects.using("db2")

    cust_data = cust_obj.all()

    for item in cust_data:

        dic_data[item.cust_id] = item.cust_name + "_" + item.cust_type

    return JsonResponse({"data": dic_data}, status=status.HTTP_200_OK)

@api_view(["POST"])

def add_flower(request):

    """

    添加信息

    :param request:

    :return:

    """

    json_param = JSonParser().parse(request)

    # using("db2"):选择此查询集应针对哪个数据库执行

    cust_obj = customer.objects.using("db2")

    cust_obj.create(cust_name=json_param.get("name"),

                    cust_type=json_param.get("type"),

                    cust_id=json_param.get("id")

                    )

    return JsonResponse({"massage": "添加成功"}, status=status.HTTP_200_OK)

十、Django模型修改、新增及数据迁移

参考文档:Django模型修改及数据迁移 - 再见紫罗兰 - 博客园

10.1现有模型修改、新增新模型

S1:新增(修改)models.py内容

如果是在现有的model内插入新列,则需要设置新列的默认值

class customer(models.Model):

    cust_id = models.CharField('用户编号', primary_key=True, max_length=40)

    cust_name = models.CharField('用户名称', max_length=30)

    cust_live = models.CharField('是否喜欢', max_length=10, default="")

    # 新增cust_desc列,设置默认值为"",否则已存在的数据会报错

    cust_desc = models.CharField('用户描述', max_length=100, default="")

S2:在Terminal下输入

python manage.py makemigrations mysqlclient_app

python manage.py migrate mysqlclient_app --database db2

S3:view内涉及的内容进行同步变更

10.2 数据迁移

django 项目提供了数据导出、导入的方法,不指定 appname 时默认为导出所有的app

S1:导出用户数据,在Terminal下输入

python manage.py dumpdata mysqlclient_app > myapp.json  --database db2

S2:导入用户数据,在Terminal下输入

python manage.py loaddata myapp.json --database db2

十一、Django Admin

Django Admin 是将所有需要管理的数据库表集中在一个平台,使用admin后台可以快速对各个数据表进行增删改查。

设计文档:https://zhuanlan.zhihu.com/p/47962034

11.1创建超级管理员

S1:创建超级管理员用户,在Terminal下输入

 python manage.py createsuperuser

按提示输入用户名,邮箱,密码等信息。

创建的用户名:admin(LR@b123456)

S2:启动项目,在Terminal下输入:python manage.py runserver

S3:浏览器输入admin后台访问地址:http://127.0.0.1:8000/admin/​

S4:输入用户名、密码

11.2 admin内注册模型(数据表)

S1:创建项目app:python manage.py startapp blog_app

S2:models.py内创建Article模型

S3:ORM映射:

python manage.py makemigrations blog_app

python manage.py migrate blog_app

S4:Article表插入多条数据

S5:admin.py内注册该数据模型(数据表)

from django.contrib import admin

from blog_app.models import Article

# 注册数据模型

admin.site.register(Article)

S6:登录admin后台,只展示action表的id,未展示标题,页面如下:​

11.3 自定义数据表显示选项

Django的ModelAdmin自带的list_display, list_filter, list_per_page, list_editable, date_hierarchy和ordering选项可以轻松帮我们做到对数据表内的字段进行显示、编辑、排序、过滤选项等。

S1:blog_app下admin.py内定义ArticleAdmin类

from django.contrib import admin

from blog_app.models import Article

# Register your models here.

class ArticleAdmin(admin.ModelAdmin):

    # 设置列表显示字段

    list_display = ("title", "author", "status", "mod_date")

    # 设置过滤选项

    list_filter = ("status", "mod_date",)

    # 每页显示的条目

    list_per_page = 5

    # 设置 页面可编辑 字段

    list_editable = ("status",)

    # 按照 日期月份 进行筛选

    date_hierarchy = "mod_date"

    # 按照 发布日期 排序

    ordering = ("-mod_date",)

admin.site.register(Article, ArticleAdmin)

S2:admin.py内注册该数据模型(数据表)

admin.site.register(Article, ArticleAdmin)

S3:登录admin后台,新页面如下:​

11.4 修改Admin的标题Title(标题)和Header(头部)

S1:blog_app下admin.py内添加:

admin.site.site_header  = '管理后台'

11.5 添加按钮及方法

例子:自定义action,实现文章的批量发布

S1:自定义方法名(action名),如:make_published(批量发布)

S2:将方法加入到类(ArticleAdmin)的actions属性内

from django.contrib import admin

from blog_app.models import Article

class ArticleAdmin(admin.ModelAdmin):

    # 设置列表显示字段

    list_display = ("title", "author", "status", "mod_date")

    # 将自定义方法加入到actions

    actions = ["make_published"]

    # 定义批量发布的方法

    def make_published(self, request, queryset):

        queryset.update(status='1')

    # 方法描述

    make_published.short_description = "发布所选文章"

S3:登录admin后台,页面展示如下:​

11.6 权限设置

11.6.1 通过用户(Permissions)权限设置

S1:新建管理员

S2:输入相关信息,用户权限只选择需要的。

如:仅允许查看 blog_app

S3:点击保存

S4:数据库修改管理员的状态:update auth_user set is_staff=1 where username='look_admin'

S5:使用新管理员登录,只能查看blog_app页面

11.6.2 通过用户组(Group)设置权限

S1:超级管理员新建组,并设置组的权限

S2:新建管理员

S3:将管理员添加进角色组

S4:保存

S5:以新管理员账户登录,页面展示如下:

仅能看见BLOG_APP且只能操作Add

11.6.3 其他方式

参考文档:https://blog.csdn.net/weixin_42134789/article/details/84567337

十二、Django基于Pycharm调试

S1:导航栏Run点击,选择Edit configurations...

S2:选中Python,点击“+”号

S3:选择python

S4:Name 输入 任意名称,如“debug”

script path选择manage.py

Parameters 输入 runserver

S5:点击“OK”

S6:导航栏Run选择“debug”(S4中Name的名字)

S7:打断点进行调试

十三、遇到错误

13.1 问题

'cryptography' package is required for sha256_password or caching_sha2_password auth methods

解决方案:pip install cryptography

13.2 不支持Oracle客户端库版本

the Oracle Client library version is unsupported

解决方案:如果之前好好的,忽然报错,项目重新打开

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/303532.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号