表模型 - django.db.models - 查

简便写法
req = json.loads(request.body)start_time = req.get("start_time")end_time = req.get("end_time")email = req.get("email")display_name = req.get("display_name")record_obj = record_table.objectsif start_time: record_obj = record_obj.filter(record_time__gte=start_time)if end_time: record_obj = record_obj.filter(record_time__lte=end_time)if email: record_obj = record_obj.filter(email__icontains=email)if display_name: record_obj = record_obj.filter(display_name__icontains=display_name) visit_record = list(record_obj.values())
| 分类 |
语句/返回 |
条数 |
for循环 |
pandasDF |
释义 |
|
data = Book.objects.all() |
多条 |
√ |
√ |
|
|
data = Book.objects.values("r1").filter(r2='xx') |
多条 |
√ |
√ |
|
| -> |
[{'r1': 'd1'}, {'r1': 'd2'}, {'r1': 'd3'}] |
|
|
|
|
|
data = Book.objects.values_list("r1").filter(r2='xx') |
多条 |
√ |
√ |
|
| -> |
[('d1',), ('d2',)] |
|
|
|
|
|
data = Book.objects.values_list("A", "B").filter(r2='xx') |
多条 |
√ |
√ |
|
| -> |
[('a1','b1'), ('a2','b1')] |
|
|
|
|
|
data = Book.objects.values_list("r1", flat=True).filter(r2='xx') |
多条 |
√ |
√ |
|
| -> |
['d1', 'd2'] |
|
|
|
|
|
data = Book.objects.get(id=1) |
1条 |
|
√ |
|
|
data = Book.objects.filter(r2='xx') |
多条 |
√ |
√ |
|
|
data = Book.objects.filter().values() |
多条 |
√ |
√ |
|
|
data = Book.objects.exclude() |
多条 |
√ |
√ |
条件之外 |
|
data = Book.objects.get_or_create() |
多条 |
√ |
√ |
无就 增+查 有就查 |
|
data = Book.objects.order_by("-列") |
多条 |
√ |
√ |
排序 |
|
print(data.query) |
多条 |
- |
- |
看sql语句 |
books = Author.objects.all()# 全部,多条返回数组,for循环取出for book in books: print(book.name)
ORM的两种查询模式
| 方法 |
举例 |
| 原生sq1的查询方法 |
user.objects.raw("select * from user") |
| 基于ORM方法查询 |
User.objects.filter(id=xx) |
基于ORM的常用查询方法
| 方法名 |
描述 |
| User.objects.all() |
返回user表中的所有数据 |
| user.objects.get(**filter) |
返回满足条件的数据(单条,没有数据则抛出异常) |
| User.objects.filter(**filter) |
返回满足条件的数据(多条,没有数据则返回空数据) |
| User.objects.all()/filter().exists() |
返回是否有对象,True False |
| User.objects.all())/filter().count() |
返回获取到对象的数量 |
| User.objects.all()/filter().exclude(**filter) |
返回的数据中排除满足**filter的 |
User.objects.filter().distinct("age") |
返回的对象中通过某个列去重 |
user.objects.filter().order_by("age") |
返回对象中通过age排序 |
| dir(user.objects) |
查询其他方法 |
深入查询
| 属性名 |
描述 |
举例 |
| __exact |
类似于sql中的like精准查找方法 |
name__exact=正心 |
| __iexact |
精准查找且忽略大小写 |
name__iexact=正心 |
| __contains |
模糊查找类似”like %正心%” |
name__contains="正心" |
| __icontains |
模糊查找且忽略大小写 |
name__icontains="make" |
| __gt |
大于 |
age__gt=18 |
| __gte |
大于等于 |
age__gte=18 |
| __lt |
小于 |
age__lt=18 |
| __lte |
小于等于 |
age__lt=18 |
| __isnull |
是否为空 |
email__isnull=True |
| __startswith |
以什么开头 |
name__contains="make" |
| __istartswith |
同上,且忽略大小写 |
name__contains="make" |
| __endswitch |
以什么结尾 |
name__contains="make" |
| __iendswitch |
同上,且忽略大小写 |
name__contains="make" |
| __in |
查询在表中的哪个数据 |
name__in=[正心,make] |
获得最大值(时间)
latester = Book.objects.filter(r2='xx').latest('edit_time') # 最后的时间big_time = latester.edit_timeprint(big_time) # 获得最大时间# sql是ORDER BY `book`.`edit_time` DESC LIMIT 1# 速度很快
Django1.2以上就有latest()
Django从1.6起有了last()这个方法,可以依据主键直接取出最新的那个id
Django1.6起有一个earliest()最早、最小
book.objects.get
result = book.objects.get(id=id)result = { 'id': result.id, 'name': result.name, 'add_time': result.add_time.strftime('%Y-%m-%d %H:%M:%S'), 'update_time': result.update_time.strftime('%Y-%m-%d %H:%M:%S'),}