ySJ
|
2.0/chapter05/#718 |
2010-04-12 17:47:48
|
以下示例演示如何将所有Publisher的country字段值由'U.S.A'更改为'USA':
|
|
ySJ
|
2.0/chapter05/#682 |
2010-04-12 17:39:48
|
类似的,你可以用Python的range-slicing语法来取出数据的特定子集:
|
|
ySJ
|
2.0/chapter05/#676 |
2010-04-12 17:39:12
|
你可以使用标准的Python列表裁剪语句:
|
|
ySJ
|
2.0/chapter05/#652 |
2010-04-12 17:33:16
|
尽管很灵活,但是每次都要用 <literal>order_by()</literal> 显得有点啰嗦。
|
|
ySJ
|
2.0/chapter05/#636 |
2010-04-12 17:24:28
|
在你的 Django 应用中,你或许希望根据某字段的值对检索结果排序,比如说,按字母顺序。
|
|
ySJ
|
2.0/chapter05/#612 |
2010-04-12 17:17:45
|
附录C详细描述了所有的查找类型。
|
|
ySJ
|
2.0/chapter05/#611 |
2010-04-12 17:17:03
|
其他的一些查找类型有:<literal>icontains</literal>(大小写无关的<literal>LIKE</literal>),<literal>startswith</literal>和<literal>endswith</literal>, 还有<literal>range</literal>(SQL<literal>BETWEEN</literal>查询)。
|
|
ySJ
|
2.0/chapter05/#611 |
2010-04-12 17:16:35
|
其他的一些查找类型有:<literal>icontains</literal>(大小写无关的<literal>LIKE</literal>),&<literal>startswith</literal>和<literal>endswith</literal>, 还有<literal>range</literal>(SQL<literal>BETWEEN</literal>查询)。
|
|
ySJ
|
2.0/chapter05/#611 |
2010-04-12 15:33:05
|
其他的一些查找类型有:<literal>icontains</literal>(大小写无关的<literal>LIKE</literal>),&<literal>startswith</literal>和<literal>endswith</literal>, 还有<literal>range</literal>(SQL<literal>BETWEEN</literal>查询)。
|
|
ySJ
|
2.0/chapter05/#611 |
2010-04-12 15:31:48
|
其他的一些查找类型有:<literal>icontains</literal>(大小写无关的<literal>LIKE</literal>),&<literal>startswith</literal>和<literal>endswith</literal>, 还有<literal>range</literal>(SQL<literal>BETWEEN</literal>查询)。
|
|
ySJ
|
2.0/chapter05/#608 |
2010-04-12 15:30:14
|
在 <emphasis>name</emphasis> 和 <literal>contains</literal> 之间有双下划线。和Python一样,Django也使用双下划线来表明会进行一些魔术般的操作。这里,<literal>contains</literal>部分会被Django翻译成<literal>LIKE</literal>语句:
|
|
ySJ
|
2.0/chapter05/#608 |
2010-04-12 15:29:52
|
在 <emphasis>name</emphasis> 和 <literal>contains</literal> 之间有双下划线。和Python一样,Django也使用双下划线来表明会进行一些魔术般的操作。这里,<literal>contains</literal>部分会被Django翻译成<literal>LIKE</literal>语句。
|
|
ySJ
|
2.0/chapter05/#605 |
2010-04-12 15:24:47
|
其他类型的查找也可以使用:
|
|
ySJ
|
2.0/chapter05/#600 |
2010-04-12 15:22:16
|
多个参数会被转换成 <literal>AND</literal> SQL从句,
|
|
ySJ
|
2.0/chapter05/#578 |
2010-04-12 15:20:16
|
所有的模型都自动拥有一个 <literal>objects</literal> 管理器;你可以在想要查找数据时使用它。
|
|
ySJ
|
2.0/chapter05/#583 |
2010-04-12 15:17:46
|
现在,我们就先当它是一个仿真列表对象好了。
|
|
ySJ
|
2.0/chapter05/#582 |
2010-04-12 15:17:25
|
附录C将详细描述QuerySet。
|
|
ySJ
|
2.0/chapter05/#580 |
2010-04-12 15:16:45
|
最后,还有 <literal>all()</literal> 方法。这个方法返回返回数据库中所有的记录。
|
|
ySJ
|
2.0/chapter05/#581 |
2010-04-12 15:16:09
|
尽管这个对象 看起来 象一个列表(list),它实际是一个 QuerySet 对象, 这个对象是数据库中一些记录的集合。
|
|
ySJ
|
2.0/chapter05/#580 |
2010-04-12 15:14:34
|
最后,还有 <literal>all()</literal> 方法。这个方法返回返回数据库中所有的行。
|
|
ySJ
|
2.0/chapter05/#574 |
2010-04-12 15:13:00
|
然后,是<literal>objects</literal>属性。
|
|
ySJ
|
2.0/chapter05/#563 |
2010-04-12 15:04:55
|
设计的时候就是这样:
|
|
ySJ
|
2.0/chapter05/#565 |
2010-04-12 15:03:39
|
明言胜于暗示。
|
|
ySJ
|
2.0/chapter05/#548 |
2010-04-12 15:01:55
|
请参阅后面的“更新多个对象”小节以了解如何实现这种轻量的修改(只修改对象的部分字段)。
|
|
ySJ
|
2.0/chapter05/#548 |
2010-04-12 15:01:37
|
请参阅后面的“更新多个对象”小节以了解如何执行这种轻量的修改(只修改对象的部分字段)。
|
|
ySJ
|
2.0/chapter05/#546 |
2010-04-12 14:57:42
|
注意,并不是只更新修改过的那个字段,所有的字段都会被更新。
|
|
ySJ
|
2.0/chapter05/#547 |
2010-04-12 14:56:20
|
这个操作有可能引起竞态条件,这取决于你的应用程序。
|
|
ySJ
|
2.0/chapter05/#519 |
2010-04-12 14:51:07
|
最后, <literal>__unicode__()</literal> 也是一个很好的例子来演示我们怎么添加 <emphasis>行为</emphasis> 到模型里。
|
|
ySJ
|
2.0/chapter05/#514 |
2010-04-12 14:50:18
|
为了让我们的修改生效,先退出Python Shell,然后再次运行 <literal>python manage.py shell</literal> 进入。(这是保证代码修改生效的最简单方法。)现在<literal> Publisher</literal>对象列表容易理解多了。
|
|
ySJ
|
2.0/chapter05/#512 |
2010-04-12 14:47:49
|
这是一个很好的起点:http://www.joelonsoftware.com/articles/Unicode.html。
|
|
ySJ
|
2.0/chapter05/#498 |
2010-04-12 14:39:46
|
如果你把奇特的字符(其它任何超出标准128个如0-9和A-Z之类的ASCII字符)保存在一个普通的Python字符串里,你一定要跟踪你的字符串是用什么编码的,否则这些奇特的字符可能会在显示或者打印的时候出现乱码。
|
|
ySJ
|
2.0/chapter05/#497 |
2010-04-12 14:38:16
|
普通的python字符串是经过<emphasis>编码</emphasis>的,意思就是它们使用了某种编码方式(如ASCII,ISO-8859-1或者UTF-8)来编码。
|
|
ySJ
|
2.0/chapter05/#495 |
2010-04-12 14:37:20
|
你可以认为unicode对象就是一个Python字符串,它可以处理上百万不同类别的字符——从古老版本的Latin字符到非Latin字符,再到曲折的引用和艰涩的符号。
|
|
ySJ
|
2.0/chapter05/#485 |
2010-04-12 13:56:32
|
<literal>Publisher</literal>和<literal>Book</literal>对象的<literal>__unicode__()</literal>方法简单地返回各自的名称和标题,<literal>Author</literal>对象的<literal>__unicode__()</literal>方法则稍微复杂一些,它将<literal>first_name</literal>和<literal>last_name</literal>字段值以空格连接后再返回。
|
|
ySJ
|
2.0/chapter05/#484 |
2010-04-12 13:47:34
|
就象你看到的一样, <literal>__unicode__()</literal> 方法可以进行任何处理来返回对一个对象的字符串表示。
|
|
ySJ
|
2.0/chapter05/#481 |
2010-04-12 13:45:54
|
为以上三个模型添加<literal>__unicode__()</literal>方法后,就可以看到效果了:
|
|
ySJ
|
2.0/chapter05/#476 |
2010-04-12 13:44:20
|
当我们打印整个publisher列表时,我们没有得到想要的有用信息,无法把<literal></literal>对象区分开来:
|
|
ySJ
|
2.0/chapter05/#480 |
2010-04-12 13:42:44
|
<literal>__unicode__()</literal> 方法告诉Python如何将对象以unicode的方式显示出来。
|
|
ySJ
|
2.0/chapter05/#479 |
2010-04-12 13:41:31
|
我们可以简单解决这个问题,只需要为<literal>Publisher</literal> 对象添加一个方法 <literal>__unicode__()</literal> 。
|
|
ySJ
|
2.0/chapter05/#472 |
2010-04-12 13:39:43
|
当然,你肯定想执行更多的Django数据库API试试看,不过,还是让我们先解决一点烦人的小问题。
|
|
ySJ
|
2.0/chapter05/#440 |
2010-04-12 13:33:03
|
你可以手动启动命令行客户端(例如,执行PostgreSQL的<literal> psql</literal> 命令),也可以执行 <literal> python manage.py dbshell</literal> ,这个命令将依据<literal> DATABASE_SERVER</literal> 的里设置自动检测使用哪种命令行客户端。
|
|
ySJ
|
2.0/chapter05/#437 |
2010-04-12 13:30:44
|
如果你再次运行 <literal>python manage.py syncdb</literal> ,什么也没发生,因为你没有添加新的模型或者 添加新的app。因此,运行<literal>python manage.py syncdb</literal>总是安全的,因为它不会重复执行SQL语句。
|
|
ySJ
|
2.0/chapter05/#435 |
2010-04-12 13:27:24
|
(更多内容请查看本章最后的“修改数据库的架构”一段。)
|
|
ySJ
|
2.0/chapter05/#434 |
2010-04-12 13:23:52
|
需要注意的是, <literal>syncdb</literal> 并 <emphasis>不能</emphasis>将模型的修改或删除同步到数据库;如果你修改或删除了一个模型,并想把它提交到数据库,<literal>syncdb</literal>并不会做出任何处理。
|
|
ySJ
|
2.0/chapter05/#425 |
2010-04-12 13:18:59
|
如果你想这么做的话,你可以把那些SQL语句复制到你的数据库客户端执行,或者通过Unix管道直接进行操作(例如,<literal> python manager.py sqlall books | psql mydb</literal> )。不过,Django提供了一种更为简易的提交SQL语句至数据库的方法:
|
|
ySJ
|
2.0/chapter05/#424 |
2010-04-12 13:17:24
|
<literal>sqlall</literal> 命令并没有在数据库中真正创建数据表,只是把SQL语句段打印出来,这样你可以看到Django究竟会做些什么。
|
|
ySJ
|
2.0/chapter05/#422 |
2010-04-12 13:15:50
|
例子中的输出是基于PostgreSQL语法的。
|
|
ySJ
|
2.0/chapter05/#421 |
2010-04-12 13:15:00
|
同样的,字段名称也是自动处理(例如单引号还好是双引号)。
|
|
ySJ
|
2.0/chapter05/#420 |
2010-04-12 13:14:14
|
这些 <literal>CREATE TABLE</literal> 语句会根据你的数据库而作调整,这样象数据库特定的一些字段例如:<literal></literal>(MySQL),<literal></literal>(PostgreSQL),<literal></literal>(SQLite),都会自动生成。
|
|
ySJ
|
2.0/chapter05/#416 |
2010-04-12 13:08:54
|
你猜对了,这个同样是可以自定义的。
|
|