字段查询
字段查询是指如何指定SQL WHERE 子句的内容。
它们通过查询集方法filter()、exclude() 和 get() 的关键字参数指定。
查询的关键字参数的基本形式是field__lookuptype=value。(中间是两个下划线)。例如:
>>> Entry.objects.filter(pub_date__lte='2006-01-01')翻译成SQL(大体)是:
SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01';
查询条件中指定的字段必须是模型字段的名称。
但有一个例外,对于ForeignKey你可以使用字段名加上_id 后缀。
在这种情况下,该参数的值应该是外键的原始值。例如:
>>> Entry.objects.filter(blog_id=4)
如果你传递的是一个不合法的参数,查询函数将引发 TypeError。
这些数据库API 支持大约二十多种查询的类型
下面是一些你可能用到的常见查询:
-
exact:
“精确”匹配。
例如:
-
>>> Entry.objects.get(headline__exact="Man bites dog")
将生成下面的SQL:
SELECT ... WHERE headline = 'Man bites dog';
如果你没有提供查询类型 —— 即如果你的关键字参数不包含双下划线
—— 默认假定查询类型是exact。
例如,下面的两条语句相等:
>>> Blog.objects.get(id__exact=14) # Explicit form
>>> Blog.objects.get(id=14) # __exact is implied
这是为了方便,因为exact 查询是最常见的情况。
>>> Blog.objects.get(name__iexact="beatles blog")
将匹配标题为"Beatles Blog"、"beatles blog" 甚至"BeAtlES blOG" 的Blog。
-
contains:
大小写敏感的包含关系测试。
例如:
-
Entry.objects.get(headline__contains='Lennon')
大体可以翻译成下面的SQL:
SELECT ... WHERE headline LIKE '%Lennon%';
注意,这将匹配'Today Lennon honored' 但不能匹配'today lennon honored'。
还有一个大小写不敏感的版本,icontains。
startswith,
endswith
- 分别表示以XXX开头和以XXX结尾。
- 当然还有大小写不敏感的版本,叫做istartswith 和 iendswith。