django orm的基础操作(django提供的数据库操作)
字面意思:
O->Object RM->Relational (关系) Mapping(映射)
代表什么思想:
实际上就是一种把数据库映射成对象的想法
- 数据库的表(table) --> 类(class)
- 记录(record,行数据)–> 对象(object)
- 字段(field)–> 对象的属性(attribute)
QuerySet
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
QuerySet实际上是一个object的列表
当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
- all():返回所有数据。
- filter():返回满足条件的数据。
- exclude():返回满足条件之外的数据。
- order_by():对结果进行排序。
ORM的基本操作1
# ORM操作
qs = models.Teacher.objects.all() # 获取全部的teacher数据 qs-QuerySet
name = qs.values('name') # 通过values进行字段过滤
print(name) # --<QuerySet [{'name': '牛牛'}, {'name': '大师兄'}]>
count = qs.count() # 获取qs的个数
firstData = qs.first() # 获取qs的第一个数据
print(firstData) # --Teacher object (1)
valueList = qs.values_list('name') # 只获取数据中的Value
print(valueList) #--<QuerySet [('牛牛',), ('大师兄',)]>
teacher = models.Teacher.objects.all().first() # 获取第一个数据 obj
teacher = models.Teacher.objects.all()[0:2] # 切片获取qs
name = teacher.name
print(name) # --牛牛
ORM的基本操作2
# 执行原生的SQL
teacher = models.Teacher.objects.raw('select * from teacher;')
# filter的数据库操作
teacher = models.Teacher.objects.filter(name__contains='大') # 过滤 模糊查询
teacher = models.Teacher.objects.filter(name__endswith='牛') # 过滤 以什么为结尾
teacher = models.Teacher.objects.filter(name__startswith='牛') # 过滤 以什么为开始
teacher = models.Teacher.objects.filter(name__in=['大师兄', '牛牛']) # 过滤 在什么范围内
teacher = models.Teacher.objects.filter(name__isnull=True) # 过滤 为空
teacher = models.Teacher.objects.filter(id__gt=1) # 过滤 大于
teacher = models.Teacher.objects.filter(id__gte=1) # 过滤 大于等于
teacher = models.Teacher.objects.filter(id__lt=1) # 过滤 小于
teacher = models.Teacher.objects.filter(id__lte=1) # 过滤 小于等于
teacher = models.Teacher.objects.filter(id__range=[1, 4]) # 过滤 在1到4之间 between and
teacher = models.Teacher.objects.exclude(id__gt=2) # 排除 id 大于2的 其他用法和filter相同
多条件查询
# 多条件查询
# ADN 操作
teacher = models.Teacher.objects.filter(name='大师兄', id=2) # 过滤 filter中都是and操作。
# OR 操作
# 通过django中提供的Q来实现负责的过滤
# 导入 from django.db.models import Q
teacher = models.Teacher.objects.filter(Q(name='大师兄') & Q(id=2)) # & 相当于sql中的and
teacher = models.Teacher.objects.filter(Q(name='大师兄') | Q(id=2)) # | 相当于sql中的 or
# 在Q前面可以通过~取反,代表name!=大师兄 and id=1
teacher = models.Teacher.objects.filter(~Q(name='大师兄') & Q(id=1))
# 使用Q之外 还可以使用关键字参数,再次进行过滤,Q必须写在关键字参数的前面
teacher = models.Teacher.objects.filter(~Q(name='大师兄') | Q(id=1), name__contains='牛')