django 模型层 知识要点(一)

来源:互联网 发布:周易八卦软件 编辑:程序博客网 时间:2024/06/10 21:47
通过模型中的Manager构造一个QuertSet,来从你的数据库中获取对象。
QuerySet表示你数据库中取出来的一个对象的集合。它可以含有零个、一个或者多个过滤器,
过滤器根据所给的参数限制查询结果的范围。
在sql的角度,QuerySet和SELECT命令等价,过滤器是像WHERE和LIMIT一样的限制子句。
管理器通常只可以通过模型类来访问,不可以通过模型实例来访问。这是为了强制区分表级别和记录级别的操作


all()方法返回包含数据库中所有对象的QuerySet。
使用过滤器获取特定对象
**all()**方法返回的结果集中包含全部对象,但是更普遍的情况是你需要获取完整集合的一个子集。


要创建这样一个子集,需要精炼上面的结果集,增加一些过滤器作为条件。两个最普遍的途径是:


filter(**kwargs)
返回一个包含对象的集合,它们满足参数中所给的条件。
exclude(**kwargs)
返回一个包含对象的集合,它们***不***满足参数中所给的条件。
查询参数(上面函数定义中的****kwargs**)需要满足特定的格式,字段检索一节中会提到。
举个例子,要获取年份为2006的所有文章的结果集,可以这样使用**filter()**方法:
Entry.objects.filter(pub_date__year=2006)
在默认的管理器类中,它相当于:
Entry.objects.all().filter(pub_date__year=2006)


查询集是延迟的
QuerySet 不能从数据库中主动地获得数据,得被动地由你来请求。
对 QuerySet 求值就意味着 Django 会访问数据库。


Django 不支持对查询集做负数索引 (例如 Entry.objects.all()[-1]) 。


一般来说,对 QuerySet 切片会返回新的 QuerySet – 这个过程中不会对运行查询。
不过也有例外,如果你在切片时使用了 “step” 参数,查询集就会被求值,就在数据库中运行查询。


数据库 API 支持24种查询类型;可以在 字段筛选参考(field lookup reference) 查看详细的列表
如果你没有提供查询类型 – 也就是说关键字参数中没有双下划线,那么查询类型就会被指定为 exact。
iexact


忽略大小写的匹配


contains


大小写敏感的模糊匹配。 例如:
Entry.objects.get(headline__contains='Lennon')
大体可以翻译为如下的 SQL:
SELECT ... WHERE headline LIKE '%Lennon%';


startswith, endswith


分别匹配开头和结尾,同样也有忽略大小写的版本 istartswith 和 iendswith。
Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。


字段筛选条件相当于 LIKE SQL 语句 (iexact, contains, icontains, startswith, istartswith, 
endswith 和 iendswith) ,它会自动转义两个特殊符号 – 百分号%和下划线_。
(在 LIKE 语句中,百分号%表示多字符匹配,而下划线_表示单字符匹配。)
这就意味着我们可以直接使用这两个字符,而不用考虑他们的 SQL 语义。


用 Q 对象实现复杂查找 (Complex lookups with Q objects)
在 filter() 等函式中关键字参数彼此之间都是 “AND” 关系。
如果你要执行更复杂的查询(比如,实现筛选条件的 OR 关系),可以使用 Q 对象。
Q 对象(django.db.models.Q)是用来封装一组查询关键字的对象。


你可以用 & 和 | 连接任意多的 Q 对象,而且可以用括号分组。Q 对象也可以用 ~ 操作取反,
而且普通查询和取反查询(NOT)可以连接在一起使用:


Q(question__startswith='Who') | ~Q(pub_date__year=2005)
每种查询函式(比如 filter(), exclude(), get()) 除了能接收关键字参数以外,也能以位置参数的形式接受一个或多个 Q 对象。
如果你给查询函式传递了多个 Q 对象,那么它们彼此间都是 “AND” 关系。
Poll.objects.get(
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
    question__startswith='Who')


在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象
delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 
所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用:
Entry.objects.all().delete()


add(obj1, obj2, ...)


将某个特定的 model 对象添加到被关联对象集合中。


create(**kwargs)

创建并保存一个新对象,然后将这个对象加被关联对象的集合中,然后返回这个新对象。

remove(obj1, obj2, ...)

将某个特定的对象从被关联对象集合中去除。

clear()

清空被关联对象集合。
原创粉丝点击