Django使用MySql数据库教程
连接数据库
- 手动创建数据库
- settings中设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'root',
'PASSWORD': '123456',
'HOST': 'localhost',
'PORT': '3306',
}
}
- 项目同名的目录下,init文件,修改:
import pymysql
pymysql.install_as_MySQLdb()
- app中的models文件
from django.db import models
class UserInfo(models.Model):
nid = models.AutoField(primary_key=True) # 自增字段,设置为主键
username = models.CharField(max_length=32) # 字符串字段,最大长度为32
password = models.CharField(max_length=64)
- settings文件注册app
INSTALLED_APPS = [
'app',
]
- 创建数据库表
命令:
# 生成配置文件
python manage.py makemigrations
# 执行配置文件
python manage.py migrate
-
想要修改表结构,直接在models文件中操作,然后执行6中的两条命令即可
-
创建外键关系
from django.db import models
class UserGroup(models.Model):
"""
部门
"""
title = models.CharField(max_length=32)
class UserInfo(models.Model):
"""
员工
"""
nid = models.AutoField(primary_key=True) # 自增字段,设置为主键,不写也会有自增的id字段
user = models.CharField(max_length=32) # 字符串字段,最大长度为32
password = models.CharField(max_length=64)
# age = models.IntegerField(null=True) # 可以为空
age = models.IntegerField(default=1) # 设置默认值
ug = models.ForeignKey("UserGroup", null=True, on_delete=models.CASCADE) # 外键关系
# Django会自动在数据库中创建名称为 ug_id
- 数据库操作
def index(request):
# 新增记录
models.UserGroup.objects.create(title='销售部')
# 查找
group_list = models.UserGroup.objects.all()
print(group_list) # 输出为QuerySet类型 (相当于列表)
for row in group_list:
print(row.id, row.title)
# 筛选查找,逗号连接的,指的是 and
group_list = models.UserGroup.objects.filter(id=1,title='abc')
group_list = models.UserGroup.objects.filter(id__gt=1) # 筛选id>1 (双下划线)
group_list = models.UserGroup.objects.filter(id__lt=1) # 筛选id<1
# 删除
models.UserGroup.objects.filter(id=2).delete()
# 更新
models.UserGroup.objects.filter(id=2).update(title='公关部')
ORM连表操作
app的models.py
from django.db import models
# Create your models here.
class Foo(models.Model):
caption = models.CharField(max_length=16)
class UserType(models.Model):
"""
用户类型
"""
title = models.CharField(max_length=32)
fo = models.ForeignKey('Foo', on_delete=models.CASCADE)
class UserInfo(models.Model):
"""
用户表
"""
name = models.CharField(max_length=16)
age = models.IntegerField()
ut = models.ForeignKey('UserType', on_delete=models.CASCADE)
app的views.py
from django.shortcuts import render, HttpResponse
# Create your views here.
from app01 import models
def test(request):
# models.UserType.objects.create(title='普通用户')
# models.UserType.objects.create(title='超级用户')
# models.UserType.objects.create(title='白金用户')
# models.UserInfo.objects.create(name='张三', age=18, ut_id=1)
# models.UserInfo.objects.create(name='李四', age=18, ut_id=2)
# models.UserInfo.objects.create(name='王二麻子', age=18, ut_id=3)
# models.UserInfo.objects.create(name='陈五', age=18, ut_id=3)
# models.UserInfo.objects.create(name='徐六', age=18, ut_id=3)
# 获取
result = models.UserInfo.objects.all()
for obj in result:
print(obj.name, obj.age, obj.ut_id, obj.ut.title, obj.ut.caption)
# obj.ut.title 获取的是 UserInfo连接表UserType中的title值,
# 同理 obj.ut.caption 获取的是 UserInfo连接表的UserType连接表的caption值
return HttpResponse('...')
“正向操作” 与 “反向操作”
app的models.py
from django.db import models
class UserType(models.Model):
"""
用户类型
"""
title = models.CharField(max_length=32)
class UserInfo(models.Model):
"""
用户表
"""
name = models.CharField(max_length=16)
age = models.IntegerField()
ut = models.ForeignKey('UserType', on_delete=models.CASCADE)
app的views.py
def test(request):
# '正向操作', 对有FK语句的表进行操作
result = models.UserInfo.objects.all()
for obj in result:
print(obj.name, obj.age, obj.ut_id, obj.ut.title)
# 通过ut将fk连接的表内容读取出来
# 例如此处,拿出来的是每个用户对应的用户类型
# '反向操作', 对没有fk语句的表进行操作
# userinfo_set意义: fk所连接的表名的消息,加下划线,加set。
obj = models.UserType.objects.all().first()
print('用户类型', obj.id, obj.title)
for row in obj.userinfo_set.all():
print(row.name, row.age)
# 比如此处,把属于第一个用户类型的所有用户的信息读取出来
return HttpResponse('...')
# obj.userinfo_set.filter() 对用户类型中的所有用户信息进行筛选
获取数据的方法
def test(request):
# 获取多个数据时
# 1. 返回对象 [obj,obj,obj,...]
models.UserInfo.objects.filter(id__gt=1)
result = models.UserInfo.objects.all()
for row in result:
print(item.name, item.ut.title)
# 2. 返回字典 [{id:1,name:'aa'},{id:2,name:'bb'},...]
result = models.UserInfo.objects.all().values('id', 'name') # 只取id和name这两列
# 类型: QuerySet[{'id':'xx', 'name':'xx'}]
for row in result:
print(row['id'], row['name']) # 输出的就是字典; 无法跨表
# 实现跨表的方法
result = models.UserInfo.objects.all().values('id', 'name', 'ut__title') # ut.title改为ut__title
for item in result:
print(item['id'], item['name'], item['ut__title'])
# 3. 返回元组 [(1,'aa'),(2,'bb'),...]
result = models.UserInfo.objects.all().values_list('id', 'name')
# 类型: QuerySet[(1,'a'),(2,'b')]
for row in result:
print(row[0], item[1]) # 输出的就是元组; 无法跨表
# 实现跨表的方法
result = models.UserInfo.objects.all().values_list('id', 'name', 'ut__title')
for row in result:
print(row[0], item[1], item[2]) # 输出的就是元组; 无法跨表