【django 学习笔记】09-数据模型高级进阶
来源:互联网 发布:js 长度单位转换 编辑:程序博客网 时间:2024/06/05 18:36
访问外键(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 TABLE 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 方法中是个不错的主意。
- 【django 学习笔记】09-数据模型高级进阶
- 【django 学习笔记】08-模板高级进阶
- The Django Book 2.0--中文版--第十章: 数据模型高级进阶
- Django 数据模型进阶
- Django学习笔记之【应用和数据模型】
- Django学习笔记(11):视图进阶(上)
- 第10章: 数据模型高级进阶
- 学习笔记-地理数据模型
- 数据模型设计 学习笔记
- models数据模型学习笔记
- Django学习10:Django高级
- mybatis进阶(1)--高级映射之数据模型分析
- 【django 学习笔记】07-高级视图和URL配置
- django学习笔记(高级视图-支持验证)
- Oracle学习笔记之PL/SQL高级进阶
- Cassandra学习笔记之数据模型
- Django学习(七)(模板进阶)
- ruby进阶的学习(高级)
- Android对话框的显示位置
- Oracle中SQL PLUS的常用指令
- Makefile中变量的替换
- 【django 学习笔记】08-模板高级进阶
- IIS6环境下配置PHP5
- 【django 学习笔记】09-数据模型高级进阶
- 【django 学习笔记】10-通用视图
- 如何写BAT
- mysql 小技巧,字符集,环境变量
- 从需求角度看NOSQL发展
- 第二部分 音频压缩编码
- js url 参数分解
- 做人十要
- 【django 学习笔记】11-部署Django