Django_数据库增删改查——查
查:
contains
包含,相当于sql的like条件
Entry.objects.get(headline__contains='Lennon')
SQL equivalent:
SELECT ... WHERE headline LIKE '%Lennon%';
注意:contains区分大小写,icontains不区分大小写。
in
在给定的迭代中;通常是列表、元组或查询集。
Entry.objects.filter(id__in=[1, 3, 4])
SQL equivalent:
SELECT ... WHERE id IN (1, 3, 4);
您还可以使用查询出来的数据来动态地评估值列表,而不是提供一组文字值:
inner_qs = Blog.objects.filter(name__contains='Cheddar') entries = Entry.objects.filter(blog__in=inner_qs)
SQL equivalent:
SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%')
gt
Entry.objects.filter(id__gt=4)
SQL equivalent:
SELECT ... WHERE id > 4;
gte
大于或等于。
lt
小于。
lte
小于或等于。
startswith
区分大小写,以字符串开头。
Entry.objects.filter(headline__startswith='Lennon')
SQL equivalent:
SELECT ... WHERE headline LIKE 'Lennon%';
istartswith
不区分大小写,以字符串开头。
endswith
区分大小写,以字符串结尾。
iendswith
不区分大小写,以字符串结尾。
range
区间过渡,可对数字、日期进行过滤
import datetime start_date = datetime.date(2005, 1, 1) end_date = datetime.date(2005, 3, 31) Entry.objects.filter(pub_date__range=(start_date, end_date))
models.Account.objects.filter(register_date__range=['2020-3-24','2020-3-25'])
SQL equivalent:
SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';
警告!
使用日期过滤DateTimeField将不包括最后一天的项目,因为边界被解释为“给定日期的0am”。如果pub_date是一个DateTimeField,上面的表达式就会变成这个SQL:
选择……" 2006-01-01 00:00:00 "和" 2006-03-31 00:00:00 "之间的pub_date;
一般来说,你不能混淆日期和日期时间。
date
允许链接额外的字段查找。获取日期值。
Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
year
允许链接额外的字段查找。取整数年。
Entry.objects.filter(pub_date__year=2005)
Entry.objects.filter(pub_date__year__gte=2005)
SQL equivalent:
SELECT ... WHERE pub_date BETWEEN '2005-01-01' AND '2005-12-31'; SELECT ... WHERE pub_date >= '2005-01-01';
When USE_TZ is True, datetime fields are converted to the current time zone before filtering. 简单解决办法是把USE_TZ=False
month
允许链接额外的字段查找。取整数1(1月)到12(12月)。
Entry.objects.filter(pub_date__month=12)
Entry.objects.filter(pub_date__month__gte=6)
When USE_TZ
is True
, datetime fields are converted to the current time zone before filtering.这需要数据库中的时区定义。
SQL equivalent:
SELECT ... WHERE EXTRACT('month' FROM pub_date) = '12'; SELECT ... WHERE EXTRACT('month' FROM pub_date) >= '6';
day
允许链接额外的字段查找。需要一个整数天。
Entry.objects.filter(pub_date__day=3) Entry.objects.filter(pub_date__day__gte=3)
SQL equivalent:
SELECT ... WHERE EXTRACT('day' FROM pub_date) = '3'; SELECT ... WHERE EXTRACT('day' FROM pub_date) >= '3';
week
例子:
Entry.objects.filter(pub_date__week=52) Entry.objects.filter(pub_date__week__gte=32, pub_date__week__lte=38)
week_day
允许链接额外的字段查找。取一个整数值,表示从1(星期日)到7(星期六)的星期几。
例子:
Entry.objects.filter(pub_date__week_day=2) Entry.objects.filter(pub_date__week_day__gte=2)
hour
允许链接额外的字段查找。取0到23之间的整数。
例子:
Event.objects.filter(timestamp__hour=23) Event.objects.filter(time__hour=5) Event.objects.filter(timestamp__hour__gte=12)
SQL equivalent:
SELECT ... WHERE EXTRACT('hour' FROM timestamp) = '23'; SELECT ... WHERE EXTRACT('hour' FROM time) = '5'; SELECT ... WHERE EXTRACT('hour' FROM timestamp) >= '12';
同时,还支持mintue,second
Event.objects.filter(time__minute=46) Event.objects.filter(timestamp__second=31)
isnull
为真或假,分别对应于IS NULL和IS NOT NULL的SQL查询。
例子:
Entry.objects.filter(pub_date__isnull=True)
SQL equivalent:
SELECT ... WHERE pub_date IS NULL;
regex(正则)
区分大小写的正则表达式匹配。
例子:
models.Account.objects.filter(username__regex=r'^(w|y)')
SQL equivalents:
SELECT ... WHERE title REGEXP BINARY '^(w|y) +'; -- MySQL
iregex 大小写不敏感
数据返回后的展示
values()
values
(*fields, **expressions)
返回一个QuerySet,它返回字典,而不是模型实例(当用作迭代时)。
In [7]: models.Account.objects.values() Out[7]: <QuerySet [{'id': 2, 'username': '王佃超', 'email': '819699374@qq.com', 'password': 'wdc', 'register_date': datet ime.datetime(2020, 3, 24, 14, 56, 20, 333505, tzinfo=<UTC>), 'signature': None}, {'id': 3, 'username': 'yhf', 'email': '4 8846@qq.com', 'password': '4654879', 'register_date': datetime.datetime(2020, 3, 24, 15, 13, 37, 111371, tzinfo=<UTC>), ' signature': 'zaqwqw'}, {'id': 4, 'username': 'wdcwdc', 'email': '12314@qq.com', 'password': '1351351345', 'register_date' : datetime.datetime(2020, 3, 26, 6, 25, 58, 44693, tzinfo=<UTC>), 'signature': 'test'}]>
In [7]: models.Account.objects.values() Out[6]: <QuerySet [{'id': 4, 'username': 'wdcwdc'}, {'id': 3, 'username': 'yhf'}, {'id': 2, 'username': '王佃超'}]>
order_by()
order_by
(*fields)
models.Account.objects.values('id','register_date').order_by('id') # 按id排序 models.Account.objects.values('id','register_date').order_by('-id') # 按id倒序 models.Account.objects.values('id','register_date').order_by('id','register_date') # 先按id排序,再按'register_date'排序
reverse()
反转:将排序后的内容反转。
如果想取最后一个字典的内容:可以反转之后取第一个。
排除 id为2 的记录,返回剩下的全部记录。
count()
# 返回查询到的记录数量。ret为int类型。
ret = models.Account.objects.all().count()
print(ret)
exist()
# 判断是否有数据,如果有,返回True,如果没有,返回False ret = models.Account.objects.all().exists() print(ret)
values()
# 设置要查询的字段'username'。(可以放多个值)
ret = models.Account.objects.all().values('username') print(ret)
返回值为一个QuerySet的列表,列表中是字典。
values_list()
ret = models.Account.objects.all().values_list('username') print(ret)
返回值:
distinct():去重