* 非空判断

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)  //可以获取的时候设置默认值

 

翻译

搜索

复制