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

一、基础说明

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字段说明:django 框架模型之models常用的Field,这些Field的参数、及常见错误原因及处理方案。__世纪末的魔术师_的博客-CSDN博客

推荐博客博主: 大江狗  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学习-ORM数据库和Admin后台

四、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

上一篇:西门子S210驱动器接线


下一篇:算法01——patA1080 研究生入学