表模型 - 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.objects
if 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_time
print(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'),
}