您的位置:首页 > 编程语言 > Go语言

【django 学习笔记】09-数据模型高级进阶

2010-06-01 13:45 651 查看

访问外键(Foreign Key)

当你获取一个ForeignKey

段时,
你会得到相关的数据模型对象。
例如:

>>> b =
Book.objects.get(id=50)

>>>
b.publisher

<Publisher: Apress
Publishing>

>>>
b.publisher.website

u’http://www.apress.com/


通过一个“ publisher“

象,
直接获取 books ,
用 publisher.book_set.all() ,

下:

>>> p =
Publisher.objects.get(name=’Apress Publishing’)

>>>
p.book_set.all()

[<Book: The Django
Book>, <Book: Dive Into Python>, ...]

实际上,book_set
只是
一个 QuerySet(
参考第5
章的介绍),
所以它可以像QuerySet
一样,
能实现数据过滤和分切,
例如:

>>> p =
Publisher.objects.get(name=’Apress Publishing’)

>>>
p.book_set.filter(name__icontains=’django’)

[<Book: The Django
Book>, <Book: Pro Django>]

属性名称book_set
是由
模型名称的小写(
如book)
加_set
组成的。

访问多对多值(Many-to-Many
Values)

多对多和外键工作方式相同,
只不
过我们处理的是QuerySet
而不是
模型实例。 例如,
这里是如何查看书籍
的作者:

>>> b =
Book.objects.get(id=50)

>>>
b.authors.all()

[<Author: Adrian
Holovaty>, <Author: Jacob Kaplan-Moss>]

>>>
b.authors.filter(first_name=’Adrian’)

[<Author: Adrian
Holovaty>]

>>>
b.authors.filter(first_name=’Adam’)

反向查询也可以。 要查看一个作者的所有书籍,
使
用author.book_set ,

如这样:

>>> a =
Author.objects.get(first_name=’Adrian’, last_name=’Holovaty’)

>>>
a.book_set.all()

[<Book: The Django
Book>, <Book: Adrian's Other Book>]

更改数据库模式(Database
Schema)

改变模型的模式架构意味着需要按照顺序更改Python

码和数据库。

添加字段

策略就是现在数据库里加入字段,

后同步Django
的模型以包含新字
段。

首先,
进入开发环境(
也就是说,
不是在发布环境里):

在你的模型里添加字段。

运行 manage.py sqlall
[yourapp]
来测试模型新的 CREATE
TABLE
语句。 注意为新字段的列定义。

开启你的数据库的交互命令界面(

如, psql
或mysql ,
或者可以使用 manage.py dbshell )
。 执行ALTER TABLE
语句来添加新列。

使用Python
的manage.py shell,
通过导入模型
和选中表单(
例如, MyModel.objects.all()[:5] )

验证新的字段是否被正确的添加 ,

果一切顺利,
所有的语句都不会报错。

然后在你的产品服务器上再实施一遍这些步骤。

启动数据库的交互界面。

执行在开发环境步骤中,
第三步
的ALTER TABLE
语句。

将新的字段加入到模型中。 如果你使用了某种版本控制工具,
并且在第一步中,
已经提交了你在开发环境上的修改,
现在,

以在生产环境中更新你的代码了(
例如,
如果你使用Subversion,
执行svn update


重新启动Web server,
使
修改生效。

删除字段

从Model
中删除一个字段要比添加容易得多。
删除字段,
仅仅只要以下几个步骤:

删除字段,
然后重新启动你的web
服务器。

用以下命令从数据库中删除字段: ALTER
T
af07
ABLE books_book DROP COLUMN num_pages;

删除多对多关联字段

由于多对多关联字段不同于普通字段,

以删除操作是不同的。

从你的模型中删除ManyToManyField
,
然后重启web

务器。

用下面的命令从数据库删除关联表: DROP
TABLE books_book_authors;

删除模型

从文件中删除你想要删除的模型,

后重启web
服务器models.py

然后用以下命令从数据库中删除表: DROP
TABLE books_book;

Managers

增加额外的Manager


增加额外的manager
方法是
为模块添加表级功能的首选办法。

修改初始Manager
QuerySets

manager
的基本QuerySet
返回系统中的所有对象。

模型方法

为了给你的对像添加一个行级功能,

就定义一个自定义方法。有鉴于manager

常被用来用一些整表操作(table-wide),

型方法应该只对特殊模型实例起作用。

执行原始SQL
查询

可以通过导入django.db.connection

像来轻松实现,
它代表当前数据库连接。
要使用它,
需要通过connection.cursor()
得到一个游
标对像。 然后,
使用cursor.execute(sql, [params])

执行SQL
语句,
使用cursor.fetchone()
或者cursor.fetchall()
来返回记录
集。 例如:

>>> from
django.db import connection

>>> cursor =
connection.cursor()

>>>
cursor.execute(“”"







SELECT DISTINCT
first_name

FROM people_person

WHERE last_name =
%s”"”, ['Lennon'])

>>> row =
cursor.fetchone()

>>> print row

['John']

不要把你的视图代码和django.db.connection

句混杂在一起,
把它们放在自定义模型或
者自定义manager
方法中是个不
错的主意。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息