#### 1 .什么是ORM (Object Relational Mapping )
它的作用是在关系型数据库和业务实体对象做一个映射,我们在操作具体业务对象的时候就可以省去了和SQL语句打交道,只需要简单的操作对象的属性和方法。
我们在model这个模块写的类名相当于数据库中的表名
根据这个类创建的对象相当于数据库表中的一个字段
字段名.id ,字段名2.title 表示这个字段对对应的数据
#### 模型与模型之间的关系
1.多对一关系
举个列子 一个出版社出于版权问题,一本书只能由一个出版社出版,但是出版社可以有多本书的出版权,这里就是多对一的关系,通过通过相应的表来来建立一个联系,用ForeignKey来实现
class Author(models.Model):
name = CharField(length=10)
class Book(models.Model):
title = CharField(max_length=10)
author = ForeignKey(Author)
2.一对一
3.多对多
class Author(models.Model):
name = CharField(length=10)
class Book(models.Model):
title = CharField(max_length=10)
author = ManytoManyField(Author)
关系数据库本身没多多对多的关系,Django是在数据库中新建了一张表专门用来存储多对多的关系。
记得引用的ForeignKey和ManyToManyField一定要在Author的后面,如果不在后面要将参数写成字符串形式('Author')。并且ForeignKey和ManyToManyField这段关系在两个类里面都可以声明,作用是一样的,django会自动为我们把另外一半关系给对称过去。
#### ORM 中的CRUD操作
#### Create:
方法一:
task = {'a':'b'}
Task.object.create(**task)
#这种方法的好处是可以直接把字典存到数据库里面
方法二:
task = Task(title='明天吃饭吗')
task.save()
#### Retrieve
res = Task.objects.all()
res = Task.objects.filter(id=0) #对数据进行过滤,可以查询某一段数据
for row in res:
print(row.id,row.title) #不要直接将取到的所有数据进行for遍历查找用到,比如用到filter过滤,否则数据大服务器会蹦掉
filter
res = Task.objects.filter(id__gt=2) #查询id大于2
#使用filter进行登录验证
user= UserInfo.objects.filter(username=v,userpwd=p).first()
if not user:
print('登录失败')
else:
print('登录成功')
含义 后缀
大于 __gt
小于 __lt
包含 __contains
不区分大小写 __iexact="abc"
包含abc且不区分大小写 __icontains="abc"
正则表达式 __regex="^abc"
正则表达式不区分大小写 __iregex="^abc"
filter实现or
from django.db.models import Q
Item.objects.filter(Q(creator=owner) | Q(moderated=False))
exclude
Person.objects.filter(name__contains="文").exclude(age__lt=18) # 找出名称包含'文', 且排除年龄小于18岁的人
查看执行的SQL语句
Task.objects.all().query
获取指定列的结果(元组样式)
Task.objects.values_list('id','title')
获取指定列的结果(字典样式)
Task.objects.values('id', 'title')
提示:values_list 和 values 返回的并不是真正的 列表 或 字典,也是 queryset,他们也是 lazy evaluation 的(惰性评估,通俗地说,就是用的时候才真正的去数据库查)
Update
#根据指定某个条件修改
task= Task.objects.get(id=2)
task.title = 'new content'
task.save()
# 根据过滤条件修改
Task.objects.filter(id__lt=5).update(title='hello')
# 全部修改
Task.objects.all().update(title='hello world')
Delete
### 指定删除
task = Task.objects.get(id=2)
task.delete()
### 批量删除
Task.objects.filter(id_lt=10).delete()
它的作用是在关系型数据库和业务实体对象做一个映射,我们在操作具体业务对象的时候就可以省去了和SQL语句打交道,只需要简单的操作对象的属性和方法。
我们在model这个模块写的类名相当于数据库中的表名
根据这个类创建的对象相当于数据库表中的一个字段
字段名.id ,字段名2.title 表示这个字段对对应的数据
#### 模型与模型之间的关系
1.多对一关系
举个列子 一个出版社出于版权问题,一本书只能由一个出版社出版,但是出版社可以有多本书的出版权,这里就是多对一的关系,通过通过相应的表来来建立一个联系,用ForeignKey来实现
class Author(models.Model):
name = CharField(length=10)
class Book(models.Model):
title = CharField(max_length=10)
author = ForeignKey(Author)
2.一对一
3.多对多
class Author(models.Model):
name = CharField(length=10)
class Book(models.Model):
title = CharField(max_length=10)
author = ManytoManyField(Author)
关系数据库本身没多多对多的关系,Django是在数据库中新建了一张表专门用来存储多对多的关系。
记得引用的ForeignKey和ManyToManyField一定要在Author的后面,如果不在后面要将参数写成字符串形式('Author')。并且ForeignKey和ManyToManyField这段关系在两个类里面都可以声明,作用是一样的,django会自动为我们把另外一半关系给对称过去。
#### ORM 中的CRUD操作
#### Create:
方法一:
task = {'a':'b'}
Task.object.create(**task)
#这种方法的好处是可以直接把字典存到数据库里面
方法二:
task = Task(title='明天吃饭吗')
task.save()
#### Retrieve
res = Task.objects.all()
res = Task.objects.filter(id=0) #对数据进行过滤,可以查询某一段数据
for row in res:
print(row.id,row.title) #不要直接将取到的所有数据进行for遍历查找用到,比如用到filter过滤,否则数据大服务器会蹦掉
filter
res = Task.objects.filter(id__gt=2) #查询id大于2
#使用filter进行登录验证
user= UserInfo.objects.filter(username=v,userpwd=p).first()
if not user:
print('登录失败')
else:
print('登录成功')
含义 后缀
大于 __gt
小于 __lt
包含 __contains
不区分大小写 __iexact="abc"
包含abc且不区分大小写 __icontains="abc"
正则表达式 __regex="^abc"
正则表达式不区分大小写 __iregex="^abc"
filter实现or
from django.db.models import Q
Item.objects.filter(Q(creator=owner) | Q(moderated=False))
exclude
Person.objects.filter(name__contains="文").exclude(age__lt=18) # 找出名称包含'文', 且排除年龄小于18岁的人
查看执行的SQL语句
Task.objects.all().query
获取指定列的结果(元组样式)
Task.objects.values_list('id','title')
获取指定列的结果(字典样式)
Task.objects.values('id', 'title')
提示:values_list 和 values 返回的并不是真正的 列表 或 字典,也是 queryset,他们也是 lazy evaluation 的(惰性评估,通俗地说,就是用的时候才真正的去数据库查)
Update
#根据指定某个条件修改
task= Task.objects.get(id=2)
task.title = 'new content'
task.save()
# 根据过滤条件修改
Task.objects.filter(id__lt=5).update(title='hello')
# 全部修改
Task.objects.all().update(title='hello world')
Delete
### 指定删除
task = Task.objects.get(id=2)
task.delete()
### 批量删除
Task.objects.filter(id_lt=10).delete()