* 非空判断
if param is None: //只判断 null 值
if not param: //判断 null 值同时判断字段是否空值
* if - else if - else 写法:
if self.returned_at:
return "已還書"
elif self.overdue_settled:
return "借閱中(已繳部分金額)"
else:
return "借閱中(已繳部分金額)"
* 异常写法
try:
histories = histories.filter(returned_at__date=returned_at)
except Exception as e:
print("查询异常:",e)
* 时间获取
获取当前时间:
from datetime import datetime
current_time = datetime.now() //精确到时分秒【对应 db 的 timestamptz 类型】
current_date = datetime.now().date() //精确到天的时间【对应 db 的 date 类型,精确到天或者时分秒的变量,在 filter 中都不可混用】
自定义指定时间:
time = datetime(2024, 4, 14, 0, 0, 0)
time = date(2024, 4, 14)
字符串和时间之间的转换,假如有字符串时间为:date_str = %Y-%m-%d %H:%M:%S
字符串转成时间:【strptime 方法,str 字符串,time 时间,p 表示“解析”,解析成时间】
from datetime import datetime
date_time = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
如果想提取到天的时间,则:date_time_day = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date()
如果想提取到秒的时间,则:date_time_day = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').second()
时间转成字符串:【strftime 方法,str 字符串,time 时间,f 表示“格式化”,格式换成字符串】
str_now = now.strftime('%Y-%m-%d %H:%M:%S')
* 判断字符串中是否包含某个字符
if 'xx' not in username: //检查 username 是否不包含 xx 片段(如果要检查包含,去掉 not 即可)
if not username.startswith('xx'): //检查 username 前缀是否不包含 xx 片段(如果包含,去掉 not 即可)
* 大小写转换:
str.upper() //转成大写
str.lower() //转成小写
* 查询操作
History.objects.get(pk=xx) 查询一条数据【可以使用 pk 来代替表中的主键字段,也可以直接写主键字段名】
History.objects.filter(pk=xx) 查询一个集合
* and 操作【注意:判断 null 是直接根据 = 后面的 False 或者 True 来决定的,__isnull 是固定的,并没有 __isnotnull 的写法】
histories = histories.filter(returned_at__isnull=False,returned_at='2')
这句类型 sql 里面的
wherer returned_at is not null and returned_at = '2'
* or 操作
histories = histories.filter(Q(returned_at__isnull=True) | Q(returned_at=''))
这句类型 sql 里面的
wherer returned_at is null or returned_at = ''
* 模糊查询【同时不区分大小写,如果要区分大小写,去掉前面的 i 即可,即:contains,startswith,endswith】
students = User.objects.filter(email__icontains=key) --> sql where email like '%key%'
students = User.objects.filter(email__istartswith=key) --> sql where email like 'key%'
students = User.objects.filter(email__iendswith=key) --> sql where email like '%key'
* 精准匹配
students = User.objects.filter(email=key) --> sql where email = 'key'
(或者:students = User.objects.filter(email__exact=key),exact 表示区分大小写,在英文查询的时候有用,否则和上一句作用完全一样)
(所以:students = User.objects.filter(email__iexact=key),不区分大小写的精确匹配)
* django 很多查询操作,都是在字段后面使用两个下划线 __ 来操作的,比如:【包含等于使用 filter ,不包含不等于使用:exclude】
in 操作:User.objects.filter(email__in=[a,b]) --> where email in (a,b)
not in 操作:User.objects.exclude(email__in=[a,b]) --> where email not in (a,b)
= 操作:User.objects.filter(email=a)
!= 操作:User.objects.exclude(email=a)
>= 操作:User.objects.filter(age__gte=a)
<= 操作:User.objects.filter(age__lte=a)
Histroy 关联了 book 表,利用 book 表的 acno 字段不区分大小写查询
history = History.objects.get(book__acno__iexact=acno) //两个 __ 是链表里面的字段,history 表和 book 表链表,同时 book 表的 acno 字段参与判断
Histroy 单表利用自己表的 book_acno 字段不区分大小写查询
history = History.objects.get(book_acno__iexact=acno) //一个 _ 是单表里面的字段,book_acon 是 history 表里面的字段,参与判断
* 正序排列和倒叙排列
history = History.objects.filter(book=acno).order_by('create_ts') 类型 sql 中的 where book = acno order by create_ts
history = History.objects.filter(book=acno).order_by('-create_ts') 类型 sql 中的 where book = acno order by create_ts desc
* 多表链表查询
histories = History.objects.select_related('user', 'book').order_by('-created_at')
(如果要添加查询条件:History.objects.filter(xx=xx).select_related('user', 'book').order_by('-created_at') ,理论上 filter 放到前面或者后面都可以,但建议放在前面提高查询效率)
-->
SELECT
history.*
FROM
history
INNER JOIN user ON history.user_id = user.id
INNER JOIN book ON history.book_id = book.id
ORDER BY
history.created_at DESC;
* 指定返回字段:
User.objects.filter(age__gt=18).values('name', 'age')
类似:
select name,age from user where age > 18
* 事务写法:
from django.db import transaction as db_transaction
with db_transaction.atomic():
# 执行数据库操作
# 如果有异常抛出,事务将会回滚,之前的操作都会被撤销
# 如果没有异常抛出,事务会提交,将所有操作保存到数据库中
* 定义集合赋值操作
# 定义一个空集合
my_set = set()
# 给集合放入数据
my_set.add(1)
my_set.add(2)
my_set.add(3)
print(my_set) # 输出: {1, 2, 3}
或者:
my_set = {1, 2, 3}
* 定义一个数组赋值操作:
# 定义一个空列表
my_list = []
# 向列表添加数据
my_list.append(1)
my_list.append(2)
my_list.append(3)
print(my_list) # 输出: [1, 2, 3]
或者:
my_list = [1, 2, 3]
* 从一个对象集合中获取某一个字段,并且组成一个数组:
user_ids = [h['user_id'] for h in historys] //获取 historys 对象集合中的每个h对象.user_id 字段,组成 user_ids 数组
或者如下写法:
user_ids = [h.user_id for h in historys] //如果要组成集合,[]改成{}即可
* 从 def xxx 方法中,从 request 获取数据,有两种方式:
第一种:
acno = request.data['acno'] //标准的字典对象获取方式,但是不能设置默认值
第二种:
acno = request.data.get('acno', None) //可以获取的时候设置默认值
翻译
搜索
复制