一、DjangoORM 创建基本类型及生成数据库表结构
1、简介
ORM:关系对象映射。定义一个类自动生成数据库的表结构。
数据库常用的数据类型 :
- 数字
- 字符串
- 时间
ORM分为两种类型: 主流都是code first
-
- code first:先写代码,执行代码创建数据库表结构
- DB first:据库里先创建数据库表结构,根据表结构生成类,根据类操作数据库
Django也是code first。其本质:
- 根据类自动创建数据库表
2.根据类对数据库中的表进行各种操作
2、创建数据库 表结构
2.1 先写类
1 from django.db import models 2 3 class UserInfo(models.Model): # 必须继承models.Model 4 # 不写则,django默认创建ID列,自增,主键 5 # 用户名列,字符串类型,指定长度 6 username = models.CharField(max_length=32) 7 password = models.CharField(max_length=64)
2.2 注册app
执行命令python manage.py makemigrations
,会提示No changes detected
,
这是因为:执行命令时会找所有models,但是django不知道找哪个,所有需要指定一下。
在配置文件setting中
1 INSTALLED_APPS = [ 2 'django.contrib.admin', 3 'django.contrib.auth', 4 'django.contrib.contenttypes', 5 'django.contrib.sessions', 6 'django.contrib.messages', 7 'django.contrib.staticfiles', 8 'app01', # 这里添加app 9 ]
2.3执行命令生成表结构
1 python manage.py makemigrations # 生成migrations临时文件 2 python manage.py migrate # 根据migrations直接生成数据库
执行后,从migrations便会产生操作记录。生成数据库,默认情况下用的sqlite3。可以用navicat等软件直接打开。
db.sqlite3里面包含缓存、session、cookie、静态文件以及后台管理。像咱们创建的表名叫:app01_userinfo
2.4、连接mysql数据库
Django默认使用的是sqllite,如果想使用mysql数据库。代码不用改、命令也不用改,只需要改下配置文件。
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases 官网文档 # DATABASES = { # sqlite 默认 # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } # } DATABASES = { # mysql 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydatabase', 'USER': 'mydatabaseuser', 'PASSWORD': 'mypassword', 'HOST': '127.0.0.1', 'PORT': '3306', } }
注意:
1.Django在使用mysql的时候,不能帮我们创建数据库,所以我们要自己去创建
2.Django默认使用MySQLdb模块链接MySQL,但是在py3中还没有MySql模块,所以我们要使用PyMysql。
在project项目名下的__init__.py
里面
1 import pymysql 2 pymysql.install_as_MySQLdb()
二、Django ORM基本的增删改查
1 from cmdb import models #先到app中把models导入,下面可使用我们的类
2 def orm(request):
3 *****创建的三种方法,推荐使用第一种
4 # models.User_info.objects.create(username='aelex',password='123')
5 # dic = {'username':'lh','password':'231'}
6 # models.User_info.objects.create(**dic)
7 # obj = models.User_info(username='aelex',password='231')
8 # obj.save()
9 ***********基本的查数据:得到的数据是一个对象结合
10 #v=models.User_info.objects.all() #得到的是QuerySet对象,并且有多个元素,类似列表,可以进行for循环
11 #v = models.User_info.objects.filter(id=1) #filter 相当于 sql中的where
12 # v = models.User_info.objects.filter(username='lh', password='231')# 使用,拼接and的作用
13 # for row in v:
14 # print(row.id, row.username, row.password) #每个元素都是我们在定义数据库的时候的值
15 *******************删除操作
16 # models.User_info.objects.filter(id=1).delete() #先得到对象,在使用dellete方法删除
17 ******************更新操作
18 models.User_info.objects.all().update(password='888')
19 return render(request, 'orm.html')
多对多关系
方式1:手动创建
1 class host(models.Model): 2 #db_index 是创建索引,加快搜索 3 id = models.AutoField(primary_key=True) 4 hostname = models.CharField(max_length=32,db_index=True) 5 ip = models.GenericIPAddressField(db_index=True,protocol='both') 6 port = models.IntegerField() 7 b = models.ForeignKey('Busniess',to_field='id') 8 #b是一个对象,封装了另外一种表的一整行数据,这个表中并不存在b,只存在b_id 9 #视图函数中操作b是一个链表操作。 10 11 class Application(models.Model): 12 name = models.CharField(max_length=21) 13 14 class HostToApp(models.Model): 15 hobj = models.ForeignKey(to="host", to_field="id") 16 aobj = models.ForeignKey(to="Application",to_field="id")
方式2:系统自动创建
创建了一张新表,自动关联两者的主键。
1 class host(models.Model): 2 #db_index 是创建索引,加快搜索 3 id = models.AutoField(primary_key=True) 4 hostname = models.CharField(max_length=32,db_index=True) 5 ip = models.GenericIPAddressField(db_index=True,protocol='both') 6 port = models.IntegerField() 7 b = models.ForeignKey('Busniess',to_field='id') 8 #b是一个对象,封装了另外一种表的一整行数据,这个表中并不存在b,只存在b_id 9 #视图函数中操作b是一个链表操作。 10 11 class Application(models.Model): 12 name = models.CharField(max_length=21) 13 r = models.ManyToManyField(to="host")
手动创建:可以自定义列,使用类操作数据库来使用。
自动创建:只能创建三列(id,两张表的主键)。看不到这个类,所以无法直接对表进行操作。
间接操作:
obj=models.Application.obj.get(id=1) #得到一列,里面有name与r(是一个对象) obj.r.add(1) obj.r.add(1,2,3) obj.r.add(*[1,2,3]) obj.r.remove(1) 存在上面三种方式 obj.r.clear() 情况所有的对应 obj.r.set(1,2,3) 类似重置的功能,删除所有的对应,新建1-1 1-2 1-3