一、ORM创建表结构
1、创建数据库
因为Django无法创建数据库,所以需要在外面创建数据库;
2、修改Django默认数据库
在Django项目的全局配置setting
中修改默认数据库(默认是SQLlite);
# 默认
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
修改为MySQL(第三方数据库):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'s4day70db',
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': 3306,
}
}
3、修改Django默认用来连接数据库的工具
在全局的初始化文件init.py
中添加两行(Django默认使用MySQLdb连接,现改用第三方工具pymysql)
import pymysql
pymysql.install_as_MySQLdb()
4、创建表和列
在对应的App文件夹下的models.py中写ORM语句
from django.db import models
class UserInfo(models.Model):
“”“
类名即表名。需要注意的是,ORM类需要继承自`models.Model`
通过调用models的方法创建列(字段)
”“”
nid = models.BigAutoField(primary_key=True)
user = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField(default=1)
# 这里的字段名虽然是ug,创建表后自动改成ug_id
# 同时,外键关联的是整个UserGroup表,而不是其中一列,所以ug指向一张表
ug = models.ForeignKey("UserGroup",null=True)
5、注册App
在全局设置setting
中找到INSTALLED APP,并添加新增的App
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
添加后:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
]
6、创建数据表
终端执行。命令执行完后会在对应的App文件夹下生成一个migrations子目录,其中的文件为ORM操作日志。
python manage.py makemigrations # 转换成SQL语句
python manage.py migrate # 执行SQL语句
二、ORM操作表数据
from app01 import models
1、基本操作
a)增
models.表名.objects.create(field1='XXX', field2='XXX', ...)
#注意,对于外键,这里使用的是ug_id,而不是ug(创建时的字段名)
models.UserInfo.objects.create(user='root',password='pwd',age=18,ug_id=1)
b)删
models.表名.objects.filter(筛选条件).delete()
models.UserGroup.objects.filter(id=2).delete()
c)查
# 获取单条数据,不存在则报错(不建议)
group_list = models.Tb1.objects.get(id=123)
# 获取指定条件的数据
group_list = models.UserGroup.objects.filter(id=1)
# 获取全部
group_list = models.UserGroup.objects.all()
# 获取全部的指定列
group_list = models.UserGroup.objects.all().values('field1', 'field2', ...)
# 获取指定列时,可以通过外键进行跨表指定,但需要使用双下划线
group_list = models.UserGroup.objects.all().values('field1', 'ug__title', ...)
d)改
models.表名.objects.filter(筛选条件).update(修改内容)
models.UserGroup.objects.filter(id=2).update(title='公关部')
2、进阶操作(了不起的双下划线)
a)获取个数
models.Tb1.objects.filter(name='seven').count()
b) field__gt/lt
models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值
models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值
models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值
models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1且小于10的值
c) field__in
models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
d) field__isnull
Entry.objects.filter(pub_date__isnull=True)
e) field__contains
models.Tb1.objects.filter(name__contains="ven")
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.exclude(name__icontains="ven")