Entry.objects.filter(pub_date__year=2006)
# 中的 __year
# filter() 为 API
参考 常用API
1. 字段和值比较
lookuptype | 描述 | 代码 |
---|---|---|
_id | 外键ID | Entry.objects.filter(blog_id=4) 非法值抛出 TypeError |
__lte | 小于等于 | Entry.objects.filter(pub_date__lte='2006-01-01') 相当于 SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01'; |
__lt | 小于 | Entry.objects.filter(pub_date__lt='2006-01-01') |
__gt | 大于 | Entry.objects.filter(pub_date__gt='2006-01-01') |
__gte | 大于等于 | Entry.objects.filter(pub_date__gte='2006-01-01') |
__iexact | 不区分大小写 | Blog.objects.get(name__iexact="beatles blog") 匹配”Beatles Blog”, “beatles blog”,甚至”BeAtlES blOG” |
__contains | 包含(区分大小写) | Entry.objects.get(headline__contains='Lennon') 相当于 SELECT ... WHERE headline LIKE '%Lennon%'; |
__icontains | 包含(不区分大小写) | |
__startswith | 以*开头(区分大小写) | |
__istartswith | 不区分大小写 | |
__endswith | 以*结尾(区分大小写) | |
__iendswith | 不区分大小写 | |
__isnull | 空值 | |
__in | 属于(例:主键在1、4、7其中之一) | Blog.objects.filter(pk__in=[1,4,7]) |
2. 字段比较字段(F查询)
F查询有很多用途,其中一个是比较字段,还有一个是避免竞争条件。
from django.db.models import F
2.1. 示例
例子 | 代码 |
---|---|
查找 comments 数 > pingbacks 数的 Entry | Entry.objects.filter(comments__gt=F('pingbacks')) |
查找 comments 数 > pingbacks 两倍的 Entry | Entry.objects.filter(comments__gt=F('pingbacks') * 2) |
查询 rating < pingbacks 和 comments 总和的 Entry | Entry.objects.filter(rating__lt=F('comments') + F('pingbacks')) |
查询 author 名与 blog 名相同的 Entry | Entry.objects.filter(authors__name=F('blog__name')) |
查找发布超过3天后被修改的所有 Entry | Entry.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3)) |
2.2. 避免竞争关系
reporter.stories_field = F('stories_field') + 1
reporter.save()
# 相较于
reporter.stories_field += 1
reporter.save()