学习目标:
学会使用Django自带数据库的各种增删改查操作,实现基本功能。学习内容:
1、 数据库基础知识select * from tb where id>1
# 对应关系
models.tb.objects.filter(id_gt=1)
models.tb.objects.filter(id=1)
models.tb.objects.filter(id_gt=1)
2、 创建表单的一般流程
a. 创建类
from django.db import models
# 表名:amdb_userinfo
class UserInfo(models.Model):
# id列,自增,主键
# 用户名列,字符串类型,指定长度
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
b. 设置添加app
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'amdb',
]
c. 运行创建表单
python manage.py makemigrations
python manage.py migrate
d. ==========注意============
Django默认使用MySQLdb模块链接MySQL
主动修改为pymysql,在project同名文件夹下的__init__.py文件中添加如下代码即可:
import pymysql
pymysql.install_as_MySQLdb()
3、 根据类自动创建数据库表
# app下的model.py
python manage.py makemigrations
python manage.py migrate
# 字段类型:字符串 数字 时间 二进制 自增Auto(primary_key=True)
# 字段参数:
null -->db是否可以为空
default -->默认值
primary_key -->主键
db_column -->列名
db_index -->索引
unique -->唯一索引
unique_for_date -->
unique_for_month -->
unique_for_year -->
auto_now_time -->创建时,自动生成时间
auto_now -->更新时,自动更新为当前时间
# 不支持这种方式
# obj = UserGroup.objects.filter(id=1).update(Title='CEO')
# 支持下面这种更新方式
# obj = UserGroup.objects.filter(id=1).first()
# obj.Title = 'CEO'
# obj.save()
choices -->Django admin中显示下拉框,避免连表查询
blank -->Django admin中是否可以为空
verbose_name -->Django admin中显示字段中文
editable -->Django admin中是否可以被编辑
error_message -->Django admin中错误信息
help_text -->Django admin中的提示
validators -->Django admin中的自定义错误信息
4、 根据类对数据库表中的数据进行各种操作
一对多
a. 外键
b. 外键字段_id
c. models.tb.object.create(name="root",user_group_id=1)
d.
user_list = models.db.object.all()
for row in user_list:
row.id
row.user_group_id
row.user_group_Title
多对多
方式一:自定义关系表
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32, db_index=True)
ip = models.GenericIPAddressField(protocol='ipv4', db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to='Business', on_delete=models.CASCADE, to_field='id', default=1)
# 10
class Application(models.Model):
name = models.CharField(max_length=32)
# 2
class HostToApp(models.Model):
hobj = models.ForeignKey(to="Host", on_delete=models.CASCADE, to_field="nid")
aobj = models.ForeignKey(to="Application", to_field="nid", on_delete=models.CASCADE)
status = models.CharField(max_length=32)
方式二:自动创建关系表
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32, db_index=True)
ip = models.GenericIPAddressField(protocol='ipv4', db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to='Business', on_delete=models.CASCADE, to_field='id', default=1)
# 10
class Application(models.Model):
name = models.CharField(max_length=32)
r = models.ManyToManyField("Host")
无法直接对第三张表进行操作
obj = Application.objects.get(id=1)
obj.name
# 第三张表操作
添加对应关系
obj.r.add(1)
obj.r.add(2,3,4)
obj.r.add(*[1,2,3,4])
删除对应关系
obj.r.remove(1)
obj.r.remove(2,3,4)
obj.r.remove(*[1,2,3,4])
清除id为1的对象
obj.r.clear()
更新,清除原有对应关系
obj.r.set([3,5,7])
获取所有相关主机对象(列表)(queryset)
obj.r.all()
5、查找数据库中数据的方法
v1 = models.Business.objects.all()
# QuerySet
# [obj(id,caption,code),obj(id,caption,code),obj(id,caption,code)]
v2 = models.Business.objects.all().values('id','caption')
# QuerySet
# [{'id':1,'caption':'HHH'},]
v3 = models.Business.objects.all().values_list('id', 'caption')
# QuerySet
# [(1, 'HHH'),]
# nid__gt=0表示选取所有nid大于0的数据
v1 = models.Host.objects.all()
# filter和values中的跨表查询要用__代替.
v2 = models.Host.objects.all().values('nid','hostname','b_id','b__caption')
v3 = models.Host.objects.all().values_list('nid', 'hostname', 'b_id', 'b__caption')