【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
方法中是个不
错的主意。
相关文章推荐
- 20121030 The django book 笔记 数据模型高级进阶
- Django学习笔记之【应用和数据模型】
- 马哥学习笔记十四——MySQL进阶之数据类型和sql模型
- Django笔记 —— 模型高级进阶
- 【django 学习笔记】08-模板高级进阶
- django学习笔记5:模型
- Sharepoint学习笔记—架构系列-- Sharepoint的数据模型(DataModel)、数据管理(Data Management)与查询(Query System)
- Django 笔记 模型数据的读取
- Pyhton_Django学习笔记(五) 模型与MYSQL数据库使用
- Python的入门与进阶的学习笔记之Python基本数据类型
- JavaScript高级程序设计(第3版)学习笔记14——浏览器对象模型BOM
- SpringMVC:学习笔记(4)——处理模型数据
- SQL Server 函数学习笔记⑥函数的高级应用=》按规则拆分列形成行数据
- ExtJS4学习笔记九--数据模型的使用
- 流畅的Python学习笔记之第一章 Python数据模型
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
- R语言实战学习笔记-第五章 高级数据管理
- Django学习笔记六:form表单实现评论(检验数据合法性)
- Django学习笔记5 让用户拥有私有数据 访问限制
- Django 开发学习笔记(5)- 关于数据 ORM第 2 讲