20190326 Django模型基础

I. Django的ORM

对象关系映射(Object Relation Mapping),python表达数据库

II. 数据库的配置

Step 0. 在虚拟机中配置好mysql的端口转发(也就是设置端口映射)

备注:默认mysql的端口是3306

VirtualBox配置MySQL端口转发的设置Step 1
VirtualBox配置MySQL端口转发的设置Step 2

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新建一个数据库

Navicat创建数据库方法Step 1
Navicat创建数据库方法Step 2

方法二:在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插件设置,方法见截图如下:

<插入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(小写)

<插入pycharm的terminal中查询表格内容——完成映射图片>

思考:执行上面的命令,到底干了什么?

  • 在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>]>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值