django的数据库ORM操作_django
一、ORM使用
1、前期环境设置
在setting里面进行注册app
设置使用数据库类型以及信息,默认是自带的sqllite
注意:
django里面默认连接mysql的工具是mysqldb,我们若使用的是pymysql,会报错无客户端
需要修改成使用pymysql模块连接
如果出现版本问题,直接修改版本信息
2、创建数据库表
(1)根据类自动创建数据库表(找到app下的models.py)
(2)操作数据库
增:(三种方式,推荐第一种)
查:查询获取的都是 QuerySet 内部元素是对象
查找所有:
筛选查找:
and:拿到的结果还是列表
如果是一个,直接就是对象:
models.Business.objects.get(id=1) #获取到的是一个对象:如果不存在就报错
可以改写为:models.Business.objects.filter(id=1).first() #获取到对象或者不存在就是None
删:
筛选之后进行delete()
改:
筛选之后update()
3、ORM提供的字段
字段:字符串类型
数字
时间
二进制
自增(primary_key=True)
字段参数:
null:是否可以为空
default:默认值
primary_key:主键
db_column:列名
db_index:索引
unique:唯一索引
unique_for_date
unique_for_month
unique_for_year
auto_now:创建时自动生成时间
auto_now_add :更新时,自动更新为当前时间
默认每个表会自动生成自增列(id),如需进行修改,直接自己制定写自增列,不使用自动生成的id列
class User(model.Model):
uid=models.AutoFileld(primary_key=True)
caption=models.CharFileld(max_legth=32)
4、外键操作
如:
class Business(models.Model):
caption=models.CharField(max_length=32)
code=models.CharField(max_length=64,null=True,default=1)
class Host(models.Model):
hostname=models.CharField(max_length=32,db_index=True)
ip=models.GenericIPAddressField(db_index=True)
port=models.IntegerField()
b=models.ForeignKey(to='Business',to_field='id',on_delete=models.CASCADE)
生成的外键字段,在数据库中的字段,自动添加_id:b_id;
而b是对应外键的对象,可以通过这个对象关联到business表中取值:
host_list=models.Host.objects.all()
for host in host_list:
print(host.hostname)
print(host.ip)
print(host.port)
print(host.b_id)
print(host.b.caption)
操作数据:
第一种:
models.Host.objects.create(
hostname='test',
ip='192.168.1.1',
port=8000,
b_id=2,,
)
第二种:
models.Host.objects.create(
hostname='test',
ip='192.168.1.1',
port=8000,
b=models.Business.object.filter(id=2).first(),
)
5、多对多操作
(1)创建多对多
第一种:(手动创建第三张表,然后进行另外两个表的外键指定)
class Host(models.Model):
hostname=models.CharField(max_length=32,db_index=True)
ip=models.GenericIPAddressField(db_index=True)
port=models.IntegerField()
b=models.ForeignKey(to='Business',to_field='id',on_delete=models.CASCADE)
class Application(models.Model):
name=models.CharField(max_length=32)
class host_to_app(models.Model):
aobj=models.ForeignKey(to="Application",to_field='id',on_delete=models.CASCADE)
HOBJ=models.ForeignKey(to='Host',to_field='id',on_delete=models.CASCADE)
第二种:(只需要创建两张表,指定manytomany关系,自动生成第三张表)
class Host(models.Model):
nid=models.AutoField(primary_key=True)
hostname=models.CharField(max_length=32,db_index=True)
ip=models.GenericIPAddressField(db_index=True)
port=models.IntegerField()
b=models.ForeignKey(to='Business',to_field='id',on_delete=models.CASCADE)
class Application(models.Model):
name=models.CharField(max_length=32)
r=models.ManyToManyField('Host')
无法直接对第三个表直接操作,可以通过r进行操作
obj=models.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])
清空:
obj.r.clear()
重置成:
obj.r.set([2,3,4])
查询:
obj.r.all() #取出Querryset类型列表,需再循环
obj.r.filter(id=3).first() #取出一个对象
反向查询:表名_set
obj=models.Application.objects.filter(name="web").first()
host_list=obj.host_set.all()
6、数据库查询的三种方式
获取方式:
(1)获取全部数据all
v1=models.Business.objects.all() #取出Querryset类型数据,里面是对象,需循环取出
(2)只取部分字段value
v2=models.Business.objects.values("id","caption") #取出的是Querryset类型数据,里面是字典[{'id':1,"caption':"运维"},{}]
(3)获取元组格式value_list
v3=models.Business.objects.value_list("id","caption") #取出的是Querryset类型数据,里面是元组[(1,运维),(2,开发),]
渲染方式:
1 def business(request): 2 #所有查询 3 v1=models.Business.objects.all() 4 #查询部分字段 value 5 v2=models.Business.objects.values('id','caption',) 6 7 #查询部分字段,返回元组格式 value_list 8 v3=models.Business.objects.values_list('id','caption') 9 10 return render(request, 'business.html', {"v1": v1, "v2": v2,'v3':v3})
<ul> {% for row in v1 %} <li>{{ row.id }}-{{ row.caption }}-{{ row.code }}</li> {% endfor %} </ul> <ul> {% for row in v2 %} <li>{{ row.id }}-{{ row.caption }}</li> {% endfor %} </ul> <ul> {% for row in v3 %} <li>{{ row.0 }}-{{ row.1 }}</li> {% endfor %} </ul>