一、模型概述

https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial02/

https://www.runoob.com/django/django-model.html

Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。

MySQL 是 Web 应用中最常用的数据库。本章节我们将以 Mysql 作为实例进行介绍。你可以通过本站的 MySQL 教程 了解更多Mysql的基础知识。

二、ORM框架简介

  • django中内嵌了ORM框架,ORM框架可以将类和数据表进行对应起来,只需要通过类和对象就可以对数据表进行操作。
  • 在Django中主要是设计类:模型类。
  • ORM另外一个作用:根据设计的类生成数据库中的表。

Django的ORM框架

  • O(objects):类和对象。
  • R(Relation):关系,关系数据库中的表格。
  • M(Mapping):映射。

Django ORM框架的功能:

  • a)建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库。
  • b)根据设计的模型类生成数据库中的表格。
  • c)通过方便的配置就可以进行数据库的切换。

三、定义模型类以实现数据库表的建立

https://blog.csdn.net/u010132177/article/details/103788677 创建的项目

目录结构如下:不重要部分已删除

D:\a\django-app\project1>tree /f
│ db.sqlite3
│ manage.py
├─app1
│ │ admin.py
│ │ apps.py
│ │ models.py
│ │ tests.py
│ │ views.py
│ │ __init__.py
│ │
│ ├─migrations
│ │ │ __init__.py
└─project1
│ asgi.py
│ settings.py
│ urls.py
│ wsgi.py
│ __init__.py

3.1定义模型类,并在数据库生成对应的表

第1步,在models.py定义类(\pj1\app-te1\models.py)

from django.db import models
# 设计和表对应的类,模型类
# Create your models here. # 一类
# 图书类
class BookInfo(models.Model):
'''图书模型类'''
# 图书名称,CharField说明是一个字符串,max_length指定字符串的最大长度
btitle = models.CharField(max_length=20)
# 出版日期,DateField说明是一个日期类型
bpub_date = models.DateField()

第2步,生成迁移文件

命令:python manage.py makemigrations

  • 迁移文件是根据模型类生成的。
  • 会在生成一个迁移文件:app1\migrations\0001_initial.py
> py manage.py makemigrations
# Migrations for 'app1':
# app1\migrations\0001_initial.py
# - Create model BookInfo

0001_initial.py 详情:

from django.db import migrations, models

class Migration(migrations.Migration):
initial = True
dependencies = [
] operations = [
migrations.CreateModel(
name='BookInfo',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('btitle', models.CharField(max_length=20)),
('bpub_date', models.DateField()),
],
),
]

第3步,执行迁移文件,在数据库生成表

命令:python mange.py migrate

  • 根据迁移文件,在数据库生成表。(默认是sqlite数据库)
  • 生成表名的默认格式:应用名_模型类名小写

执行详情:

D:\a\django-app\project1>py manage.py migrate

Operations to perform:
Apply all migrations: admin, app1, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying app1.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying sessions.0001_initial... OK

注:生成的表放在数据库 【db.sqlite3】 内,表详情如下(booktest_bookinfo应为app1_bookinfo)

第4步,通过模型类操作数据表:

进入项目shell的命令:

python manage.py shell

以下为在相互shell终端中演示的例子:

0)首先导入模型类:

from booktest.models import BookInfo,HeroInfo

1)向booktest_bookinfo表中插入一条数据。

b = BookInfo() #定义一个BookInfo类的对象
b.btitle ='天龙八部' #定义b对象的属性并赋值
b.bpub_date = date(1990,10,11)
b.save() #才会将数据保存进数据库

2) 查询出booktest_bookinfo表中id为1的数据。

b = BookInfo.objects.get(id=1)

3) 在上一步的基础上改变b对应图书的出版日期。

b.bpub_date = date(1989,10,21)
b.save() #才会更新表格中的数据

4) 紧接上一步,删除b对应的图书的数据。

b.delete() #才会删除

5) 向booktest_heroInfo表中插入一条数据。

h = HeroInfo()
h.hname = '郭靖'
h.hgender = False
h.hcomment = ‘降龙十八掌’
b2 = BookInfo.objects.get(id=2)
h.hbook = b2 #给关系属性赋值,英雄对象所属的图书对象
h.save()

6) 查询图书表里面的所有内容。

BookInfo.objects.all()
HeroInfo.objects.all()

第4步实操记录,增、删、改、查

D:\a\django-app\project1>py manage.py shell
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD6
4)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from app1.models import BookInfo
>>> b=BookInfo()
>>> b.btitle='天龙八部'
>>> from datetime import date
>>> b.bpub_date=date(1998,1,2)
>>> b.save()
>
#【★★★查寻所有数据】
>>> BookInfo.objects.all()
<QuerySet [<BookInfo: BookInfo object (1)>]> #【★★★查询单条数据】获取id=1的BookInfo信息
>>> b2=BookInfo.objects.get(id=1)
>>> type(b2)
<class 'app1.models.BookInfo'>
>>> b2
<BookInfo: BookInfo object (1)> #【查看对应数据】
>>> b2.btitle
'天龙八部'
>>> b2.bpub_date
datetime.date(1998, 1, 2)
>>> b2.id
1 #【更新对应数据】,要保存之后才会生效
>>> b2.bpub_date=date(1991,2,2)
>>> b2.save()
b2.delete() #也可删除对应数据
b.delete()# 删除刚刚插入的数据

第5步,再加一个models.py类,且加上关联

再加一个models.py类,定义一个新数据表,且与BookInfo类表建立关联

错误解决: https://blog.csdn.net/weixin_33991727/article/details/93075685

报错:
TypeError: init() missing 1 required positional argument: 'on_delete' 原因:
在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,
此参数为了避免两个表里的数据不一致问题,不然会报错: 解决:把最后一句关联选项加一个on_delete参数。
hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE)

1)在project1/models.py

from django.db import models
# 设计和表对应的类,模型类
# Create your models here. # 一类
# 图书类
class BookInfo(models.Model):
'''图书模型类'''
# 图书名称,CharField说明是一个字符串,max_length指定字符串的最大长度
btitle = models.CharField(max_length=20)
# 出版日期,DateField说明是一个日期类型
bpub_date = models.DateField() # 多类
# 英雄人物类
# 英雄名 hname
# 性别 hgender
# 年龄 hage
# 备注 hcomment
# 关系属性 hbook,建立图书类和英雄人物类之间的一对多关系
class HeroInfo(models.Model):
'''英雄人物模型类'''
hname = models.CharField(max_length=20) # 英雄名称
# 性别,BooleanField说明是bool类型,default指定默认值,False代表男
hgender = models.BooleanField(default=False)
# 备注
hcomment = models.CharField(max_length=128)
# 关系属性 hbook,建立图书类和英雄人物类之间的一对多关系
# 关系属性对应的表的字段名格式: 关系属性名_id
hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE) #对应BookInfo表的主键ID

1.1建立迁移文件,并利用其创建对应的 HeroInfo表

\project1>py manage.py makemigrations
'''
Migrations for app1:
app1\migrations\0002_heroinfo.py
- Create model HeroInfo
''' \project1>py manage.py migrate
'''
Operations to perform:
Apply all migrations: admin, app1, auth, contenttypes, sessions
Running migrations:
Applying app1.0002_heroinfo... OK
'''

2)向HeroInfo插入数据

D:\a\django-app\project1>py manage.py shell
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD6
4)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from app1.models import BookInfo,HeroInfo
>>> from datetime import date
>>> b=BookInfo()
>>> b.title='天龙八部'
>>> b.bpub_date=date(1992,1,1)
>>> b.save()
>
>>> h=HeroInfo()
>>> h.hname='段誉'
>>> h.hgender=False #性别男
>>> h.comment='六脉神剑'
>>> h.hbook=b #关联键,要关联BookInfo,必须要关联到 对应表的对象,b=BookInfo()
>>> h.save() >>> h2=HeroInfo()
>>> h2.hname='乔峰'
>>> h2.hgender=False #性别男
>>> h2.comment='降龙十八掌'
>>> h2.hbook=b #关联键,要关联BookInfo,必须要关联到 对应表的对象,b=BookInfo()
>>> h2.save()

6.关联操作

  1. 查询出id为2的图书中所有英雄人物的信息。

b = BookInfo.objects.get(id=2)
b.heroinfo_set.all() #查询出b图书中所有英雄人物的信息

知识点:如果加入了中文要在py文件头部加如下一行:

# -*- coding: UTF-8 -*-

四、Django的mysql数据库配置

【参考】:https://docs.djangoproject.com/zh-hans/3.0/ref/databases/#mysql-notes

https://www.w3cschool.cn/mysql/mysql-install.html

https://blog.csdn.net/zx_water/article/details/79015603

【可视管理数据库】最好用的支持各个:navicat premium

4.1安装mysql

安装完成后需要配置环境变量(注意是mysql server 8.0):

C:\Program Files\MySQL\MySQL Server 8.0\bin

4.2 启动Mysql服务

cmd中

启动服务:
net start mysql 结束服务:
net stop mysql

如果不能启动,则计算机(右键)——管理——服务,找mysql



可发现此处mysql名变成了mysql80因此正确命令应是:

启动服务:
net start mysql80 结束服务:
net stop mysql80

4.3 通过cmd连接mysql命令:

mysql命令cmd详情

登录mysql数据库:
mysql –uroot –p #之后输入密码p.2 查看有哪些数据库:
show databases; #此处必须有分号,否则不会显示数据库 创建数据库:
create database test2 charset=utf8; #切记:指定编码 使用数据库:
use test2; 查看数据库中的表:
show tables;

cmd连接mysql实战

C:\Users\Administrator>mysql -uroot -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 8.0.13 MySQL Community Server - GPL Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| spiders |
| sys |
| world |
+--------------------+
7 rows in set (0.00 sec) mysql> create database test888 charset=utf8;
Query OK, 1 row affected, 1 warning (0.21 sec) mysql> use test888
Database changed
mysql> use test888;
Database changed
mysql> show tables;
Empty set (0.00 sec) mysql>

4.4 Django配置使用mysql数据库

  • 在此之前必须配置,安装好Mysql数据库,并新建一个数据库。(test888)

    修改project1/settings.py中的DATABASES:
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'ENGINE': 'django.db.backends.mysql',#mysql连接
'NAME': 'test888', # 使用的数据库的名字,数据库必须手动创建
'USER': 'root', # 链接mysql的用户名
'PASSWORD': 'p.2', # 用户对应的密码
'HOST': 'localhost', # 指定mysql数据库所在电脑ip
'PORT': 3306, # mysql服务的端口号
}
}

4.5 退出cmd的server服务重启报错:

D:\a\django-app\project1>py manage.py runserver
Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
.
.
.
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

4.6安装驱动

如果你没安装 mysql 驱动,会有4.5步的报错,可以执行以下命令安装:

#windows:
pip install mysqlclient # linux
sudo pip install mysqlclient

4.6重新创建移动model文件,并执行

#生成迁移文件,如果模型没变直接运行执行即可
py manage.py makemigrations #执行迁移文件生成对应的表
py manage.py migrate

实战:

D:\a\django-app\project1>py manage.py makemigrations
No changes detected D:\a\django-app\project1>py manage.py migrate
Operations to perform:
Apply all migrations: admin, app1, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying app1.0001_initial... OK
Applying app1.0002_heroinfo... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying sessions.0001_initial... OK

4.7 安装完成后,启动web服务即可:

py manage.py runserver

4.8效果 http://127.0.0.1:8000

4.9 完成

4.10 第4部分接:Django(五)

Django(三) 模型:ORM框架、定义模型类并创建一个对应的数据库、配置Mysql数据库的更多相关文章

  1. Django中的ORM框架使用小技巧

      Django中的ORM框架使用小技巧 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. Django对各个数据提供了很好的支持,包括PostgreSQL,MySQL,SQLite ...

  2. django框架配置mysql数据库

    django配置mysql数据库: 1.首先更改django项目文件中的settings.py的数据库配置 DATABASES = { 'default': { 'ENGINE': 'django.d ...

  3. DJango配置mysql数据库以及数据库迁移

    DJango配置mysql数据库以及数据库迁移 一.Django 配置MySQL数据库 在settings.py中配置 import pymysql # 配置MySQL pymysql.install ...

  4. Django配置Mysql数据库 (Pycharm)

    Django配置MySQL数据库方法 一.settings.py文件中修改数据库配置为下面的内容: # Database # https://docs.djangoproject.com/en/2.0 ...

  5. 【python-Django开发】Django 配置MySQL数据库讲解!!!

    官方文档请阅读:https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-db-api-drivers 配置MySQL数据库 1. 新建M ...

  6. Django 配置MySQL数据库 mysql

    Django 配置MySQL数据库 在settings.py中配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # ...

  7. Django 中配置MySQL数据库

    在Django的项目中会默认使用sqlite的数据库 配置MySQL需要在setting.py 里加入以下设置: 配置数据库 DATABASES = { 'default': { 'ENGINE': ...

  8. (动态模型类,我的独创)Django的原生ORM框架如何支持MongoDB,同时应对客户使用时随时变动字段

    1.背景知识 需要开发一个系统,处理大量EXCEL表格信息,各种类别.表格标题多变,因此使用不需要预先设计数据表结构的MongoDB,即NoSQL.一是字段不固定,二是同名字段可以存储不同的字段类型. ...

  9. Yii 1.1.17 三、数据库连接、定义模型、数据查询、验证登录、SESSION使用与URL生成

    一.数据库连接 1.配置连接参数 在database.php里面开启: 'db' => array( 'connectionString' => 'mysql:host=127.0.0.1 ...

随机推荐

  1. Kafka-JavaAPI(Producer And Consumer)

    Kafka--JAVA API(Producer和Consumer) Kafka 版本2.11-0.9.0.0 producer package com.yzy.spark.kafka; import ...

  2. 3_05_MSSQL课程_Ado.Net_DataSet数据集

    //创建一个内存的数据集 DataSet ds=new DataSet("LJK"); //创建一张内存表 DataTable dt01=new DataTable("d ...

  3. 怎么HTML表格中的所有字体居中?

    一开始,我在table标签里加入align="center"  发现没什么用.... 后来在css里加入,就可以了 成果如图:

  4. 树 插件 ztree 的基本用法

    因业务需要 用到 ztree 插件 第一次用tree插件上手有点难度 官网 http://www.treejs.cn/v3/main.php#_zTreeInfo 第一步:初始化树,树的所有数据从后台 ...

  5. Web - 实用组件

    1, vue-awesome-swiper  基于 Swiper4.适用于 Vue 的轮播组件,支持服务端渲染和单页应用. 2,  http://www.spritecow.com/     雪碧图背 ...

  6. 靠谱的Pycharm安装详细教程

    如何在本机上下载和安装Pycharm,具体的教程如下: 1.首先去Pycharm官网,或者直接输入网址:http://www.jetbrains.com/pycharm/download/#secti ...

  7. Django 学习之Xadmin

    一.xadmin的特点 1.基于Bootstrap3:Xadmin使用Bootstrap3.0框架精心打造.基于Bootstrap3,Xadmin天生就支持在多种屏幕上无缝浏览,并完全支持Bootst ...

  8. SLT学习——leafes tree扩展 【文艺平衡树】

    这是一个全新的数据结构 md,别看这篇文章了,这篇已经废了. 百折不饶,再交一次,更新复杂度证明 这里是HYF,蒟蒻一只,最近因某些原因开始学数据结构了,然后就写了这篇题解. 下面给大家介绍一个全新的 ...

  9. 【转载】Oracle创建数据库和用户

    以前开发的时候用得比较多的是mysql和sql server,oracle用的比较少,用起来比较生疏,mysql和sql server用起来比较类似,就oracle的使用方式和他们不同,oracle在 ...

  10. GIMP

    1. 认识GIMP 2. GIMP与Photoshop的对比 3. GIMP官方手册教程 4. 2本GIMP的外文书下载 5. 2个外部入门教程 6. 其他相关软件 1. 认识GIMP GIMP是可用 ...