Django模型基础
文章目录
I. Django的ORM
对象关系映射(Object Relational Mapping),python表达数据库。详细的介绍引用菲宇的博文《Django中的ORM详解》
https://blog.csdn.net/bbwangj/article/details/79992863
感谢原作者的总结心得分享!
II. 数据库的配置
Step 0. 在虚拟机中配置好mysql的端口转发(也就是设置端口映射)
备注:默认mysql的端口是3306
Step 1. 安装pymysql
打开pycharm的Tools>Start SSH session>crm_seven进入linux界面:
(py3env) pyvip@VIP:~$ workon crm
(crm) pyvip@VIP:~$ pip install pymysql -i https://pypi.doubanio.com/simple/
Downloading https://pypi.doubanio.com/packages/ed/39/15045ae46f2a123019aa968dfcba0396c161c20f855f11dea6796bcaae95/PyMySQL-0.9.3-py2.py3-none-any.whl (47kB)
100% |████████████████████████████████| 51kB 118kB/s
Installing collected packages: pymysql
Successfully installed pymysql-0.9.3
(crm) pyvip@VIP:~$ pip list
Package Version
---------- -------
Django 2.1.7
pip 19.0.3
PyMySQL 0.9.3
pytz 2018.9
setuptools 40.8.0
wheel 0.33.1
(crm) pyvip@VIP:~$
此时在列表中已有PyMySQL显示出来,则已经安装成功了。
- 修改项目目录下的__init__.py
** 注意,安装完pymysql之后,在__init__.py里依旧不能导入pymysql库,此时的解决办法是先关闭整个project,然后重新加载该project,再次导入才能成功。输入代码如下:
import pymysql
pymysql.install_as_MySQLdb()
Step 2. 手动创建一个当前项目的空的数据库,准备一个有创建数据库权限的用户账号
- 备注:默认mysql的端口是3306
方法一:通过Navicat for MySQL新建一个数据库
方法二:在pycharm的terminal输入指令的方法:
(py3env) pyvip@VIP:~$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.23-0ubuntu0.18.04.1 (Ubuntu)
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> create database testcrm charset=utf8;
Query OK, 1 row affected (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testcrm |
+--------------------+
5 rows in set (0.03 sec)
方法三:在pycharm侧边栏的database插件设置,方法见截图如下:
Step 3. 项目文件夹里的settings配置
DATABASES = {
'default': {
'ENGINE':'django.db.backends.mysql'
'NAME': 'crm', #数据库名
'USER': 'admin',
'PASSWORD': 'Root110qwe',
'HOST': '127.0.0.1',
'PORT': '3306'
}
}
III. 模型的创建与映射
模型
就是django.db.models.Model的一个子类
模型定义在app文件夹下的models.py文件
class Student(models.Model):
name = models.CharField(verbose_name='姓名', max_length=20)
age = models.SmallIntegerField(verbose_name='年龄', null=True) # 年龄非必填,可以为空
sex = models.SmallIntegerField(default=1)
qq = models.CharField(max_length=20, null=True)
phone = models.CharField(max_length=20, null=True)
c_time = models.DateTimeField(verbose_name='创建时间')
激活模型
- 注册应用 # 模型依赖注册,必须注册!
- 创建迁移,只是告诉django我们修改了模型,它不会操作数据库
在pycharm的terminal界面输入代码:
(py3env) pyvip@VIP:~$ cd project/crm/
(py3env) pyvip@VIP:~/project/crm$ workon crm
(crm) pyvip@VIP:~/project/crm$ python manage.py makemigrations
返回代码如下:
Migrations for 'teacher':
teacher/migrations/0001_initial.py
- Create model Student
此时数据库的表格是空的,没有任何内容。可以通过pycharm的terminal查看:
(py3env) pyvip@VIP:~$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
......
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use crm;
Database changed
mysql> show tables;
Empty set (0.00 sec)
python manage.py makemigrations <appname>
# 在根目录下执行,不写appname的话就是默认全部迁移
如果我们想看,我们的更改,会对数据库产生什么影响,我们可以看它大概会执行什么sql语句,代码如下:
python manage.py sqlmigrate <appname> <migratenumber>
<插入用指令查看迁移记录准备对数据库执行什么图片>
- 执行迁移:操作数据库,将对模型的改动应用到数据库(底层就是执行了sql)
python manage.py migrate <appname>
注意:如果以上代码中没有输入appname
,则会对所有已注册的app执行数据迁移(即所有的改动),映射到数据库中。
在pycharm的terminal之中输入:
(crm) pyvip@VIP:~/project/crm$ python manage.py migrate teacher
返回的代码如下:
Operations to perform:
Apply all migrations: teacher
Running migrations:
Applying teacher.0001_initial... OK
此时执行了teacher这个应用的所有数据迁移。
此时再在另一个terminal中输入show tables,会显示新建了两张表,如下截图:
模型映射到数据库中的一张表,表名=appname_模型name(小写)
思考:执行上面的命令,到底干了什么?
- 在app中查找迁移文件并去django_migrations表中查找,如果有未执行的迁移文件,就去执行它
- 执行了迁移生成的sql语句
- 如果成功,会在django_migrations表中增加一条记录
每次对模型的内容进行修改,就需要创建一次数据迁移,再执行迁移
IV. 简单的数据的增删改查
先在crm虚拟环境下安装ipython
(crm) pyvip@VIP:~/project/crm$ pip install ipython
django调试环境
在pycharm的terminal中输入python manage.py shell
(crm) pyvip@VIP:~/project/crm$ python manage.py shell
In [1]: from teacher.models import Student
In [2]: Student.objects.all() # 要查看Student模型里有多少数据
Out[3]: <QuerySet []> # 空集,表格中没有任何数据
此时增添内容完善表格数据
增
#第一种方式
In [4]: s = Student()
In [5]: s
Out[5]: <Student: Student object (None)>
In [6]: s.name = 'Jetfire'
In [7]: s.age = 19
In [8]: s.save() # 增添完数据之后要保存,这样数据才算添加成功
此时在mysql环境下查询student模型:
mysql> select * from teacher_student;
+----+---------+------+-----+------+-------+----------------------------+
| id | name | age | sex | qq | phone | c_time |
+----+---------+------+-----+------+-------+----------------------------+
| 1 | Jetfire | 19 | 1 | NULL | | 2019-03-27 12:48:57.878075 |
+----+---------+------+-----+------+-------+----------------------------+
1 row in set (0.00 sec)
#第二种方式 Modelname.objects.create(key1='value1', key2='value2')
这种方法可以同时传入多个键值对,
以下为例子:
In [11]: stu = Student.objects.create(name='Ironhide', age=22)
In [12]: stu.id
Out[12]: 2
In [13]: stu.name
Out[13]: 'Ironhide'
In [14]: stu.age
Out[14]: 22
删
删一条
In [15]: stu.delete()
Out[15]: (1, {teacer.Student': 1})
删多条
In [5]: Student.objects.filter(sex=1).delete()
Out[5]: (1, {teacer.Student': 1})
改
改一条
In [17]: s.age = 20
In [18]: s.save()
改多条
In [11]: Student.objects.all().update(sex=0)
Out[11]: 2
# 将Student模型中的所有对象的性别都改成女
改带条件的数据
查
1. 查所有
In [2]: Student.objects.all()
Out[2]: <QuerySet [<Student: Jetfire>, <Student: Optimus>]>
2. 查一条
In [3]: Student.objects.get(pk=1)
Out[3]: <Student: Jetfire>
注意:get返回的是对象,返回多个值时就会报错
3. 带条件查询
In [9]: res = Student.objects.filter(sex=1) # 等价于where sex=1
In [10]: res
Out[10]: <QuerySet [<Student: Jetfire>, <Student: Optimus>]>