1. 配置django使用MySQL数据库
- 在项目要目录下修改settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 要使用的数据库类型
'NAME': 'crm', # 使用的数据库名称
'UsER': 'root', # 数据库用户
'PASSWORD': 'qwe123', # 数据库密码
'HOST': '127.0.0.1', # ip
'PORT': 3306 # 端口
}
}
- 修改(编辑)项目文件夹(和settings.py 文件所在的目录)下的__init__.py 文件
# 写上下面的两句话 # 环境中要先安装pymysql pip install pymysql
import pymysql
pymysql.install_as_MySQLdb()
2. 模型的创建和激活
- 创建 app目录下的models.py
from django.db import models
# 一个模型类对应数据库中的一张表, 类属性代表表中的字段
class Students(models.Model): # 每个模型都是 django.db.models.Model 的子类
name = models.CharField(max_length=16) # 类属性
age = models.SmallIntegerField(default=0) # 年龄 默认 0 即 没有填写
sex = models.SmallIntegerField(default=1) # 性别, 默认为1 即 男
qq = models.CharField(max_length=20, default='')
phone = models.CharField(max_length=20, default='') # 默认 = '' 空, 没有填写的
create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) # 创建时间
update_time = models.DateTimeField(verbose_name='更新时间', auto_now=True)
def __str__(self):
return 'name: %s, age: %s, sex: %s' % (self.name, self.age, self.sex)
- 激活
2. 运行数据库迁移命令[可以指定哪个app要进行数据库迁移命令]: python manage.py makemigrations [app_name]
3. 执行迁移: python manage.py migrate [app_name] # python manage.py sqlmigrate [app_name] 0001 查看sql语句
3. 使用 (对数据库中表的增删改查)
- 在view.py视图函数中使用
from django.http import HttpResponse
from .models import Students # 导入创建的模型类
def add(request):
"""向表中添加数据"""
# 方法一:
long1 = Students(name='long', age=18)
long1.save()
# 方法二 与方法一算同一个方法
long2 = Students()
long2.name = 'long2'
long2.save()
# 方法三
Students.objects.create(name='long3', age=20) # 不管有没有这条数据都会增加
# 方法四
Students.objects.get_or_create(name='long4') # 先从数据库中查找这条数据,如果没有则增加,如果有则不增加
return HttpResponse('add添加数据')
def select(request):
"""向表中查找数据"""
# 1. 模型类.object.get() # 只能查找一条数据,如果有多条数据满足,则会报错
res = Students.objects.get(id=2) # Students.objects.get(pk=2) 如果不确定id是主键,可以用pk 代替, pk 一定是
# 2. 模型类.objects.filter() 查找满足条件的所有数据, 如果不写条件, 则默认查找所有数据,与 模型类.objects.all() 作用一样
res2 = Students.objects.filter(age=18) # 查找 age = 18 的所有数据
# 3. 模型类.objects.all() # 查找所有数据
res3 = Students.objects.all()
return HttpResponse('select 查看数据')
def update(request):
"""修改 更新数据"""
# 把需要更新的数据查找出来
res = Students.objects.get(id=3) # 查找出需要更新的这一条数据
res.name = 'new_name' # 修改name
res.age = 23
res.save() # 保存更新
# 修改多个
# 把 age = 18 的数据全部更新为 name = 'longdongcheng', age = 22
Students.objects.filter(age=18).update(name='longdongcheng', age=22)
# 把 表中所有数据的 name 修改为 yanyan
Students.objects.all().update(name='yanyan')
return HttpResponse('update 更新数据')
def delete(request):
# 也是把需要删除的数据先查询出来
Students.objects.get(id=1).delete() # 删除id=1 的一条数据
Students.objects.filter(age=0).delete() # 删除 age=0 的所有数据
Students.objects.all().delete() # 删除表中的所有数据
return HttpResponse('delete 删除表中的数据')
- 在 python manage.py shell 中使用 # 建议中用ipython,如果安装了ipython, 则默认会使用ipython进入 (# 与在视图中的使用是一模一样的)
(django2.1) pyvip@VIP:~/django_code/orm_model$ python manage.py shell
Python 3.6.6 (default, Sep 12 2018, 18:26:19)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.5.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: from test_model.models import Students
### 1. 增加数据
In [2]: long = Students(name='long', age=18)
In [3]: long.save() # 方法一增加一条数据
In [5]: long2 = Students()
In [6]: long2.name = 'long2'
In [7]: long2.age = 19
In [8]: long2.save() # 方法二增加数据, 相当于也是方法一,只是先实例了一下
In [9]: Students.objects.create(name='long3', age=20) # 方法三增加数据,增加并返回这条数据
Out[9]: <Students: id: 14, name: long3, age: 20, sex: 1>
In [17]: Students.objects.get_or_create(name='long') # 先查询这条数据,如果找到,则不创建,False
Out[17]: (<Students: id: 12, name: long, age: 18, sex: 1>, False)
In [18]: res = Students.objects.get_or_create(name='long4') # True, 这条数据在表中不存在,创建
In [19]: res
Out[19]: (<Students: id: 17, name: long4, age: 0, sex: 1>, True)
### 2. 查询数据
# 1. .objects.all() 查询表中的所有数据
In [20]: res = Students.objects.all()
In [21]: for i in res:
...: print(i)
...:
id: 12, name: long, age: 18, sex: 1
id: 13, name: long2, age: 19, sex: 1
id: 14, name: long3, age: 20, sex: 1
id: 15, name: long3, age: 20, sex: 1
id: 16, name: long3, age: 20, sex: 1
id: 17, name: long4, age: 0, sex: 1
In [22]:
# 2. .objects.get() # 查询一条数据, (没有, 有多个匹配都会报错)
In [25]: Students.objects.get(id=12)
Out[25]: <Students: id: 12, name: long, age: 18, sex: 1>
# 3. .objects.filter() # 查询所有满足条件的数据
In [26]: Students.objects.filter(age=18)
Out[26]: <QuerySet [<Students: id: 12, name: long, age: 18, sex: 1>]>
# filter不写条件就与.all() 一样,查询所有的数据
In [30]: res = Students.objects.filter()
In [31]: for i in res:
...: print(i)
...:
id: 12, name: long, age: 18, sex: 1
id: 13, name: long2, age: 19, sex: 1
id: 14, name: long3, age: 20, sex: 1
id: 15, name: long3, age: 20, sex: 1
id: 16, name: long3, age: 20, sex: 1
id: 17, name: long4, age: 0, sex: 1
In [32]: