1. Entry.objects.filter(pub_date__year=2006)
  2. # 中的 __year
  3. # 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查询有很多用途,其中一个是比较字段,还有一个是避免竞争条件。

  1. 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. 避免竞争关系

  1. reporter.stories_field = F('stories_field') + 1
  2. reporter.save()
  3. # 相较于
  4. reporter.stories_field += 1
  5. reporter.save()