目录
一、基础说明
二、创建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, # 端口
}
}
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, # 端口
}
}
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)
@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)
@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)
@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)
@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)
@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
解决方案:如果之前好好的,忽然报错,项目重新打开



