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

对于日期和日期时间字段,根据ISO-8601返回周数(1-52或53),即在美国,一周从星期一开始,第一周是一年的第一个星期四。

例子:

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():去重

 

posted @ 2020-03-26 17:36  手可摘星辰。  阅读(325)  评论(0编辑  收藏  举报