【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的模型以包含新字段。

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

  1. 在你的模型里添加字段。
  2. 运行 manage.py sqlall [yourapp] 来测试模型新的 CREATE TABLE 语句。 注意为新字段的列定义。
  3. 开启你的数据库的交互命令界面(比如, psql mysql , 或者可以使用 manage.py dbshell )。 执行ALTER TABLE 语句来添加新列。
  4. 使用Pythonmanage.py shell,通过导入模型和选中表单(例如, MyModel.objects.all()[:5] )来验证新的字段是否被正确的添加 ,如果一切顺利,所有的语句都不会报错。

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

  1. 启动数据库的交互界面。
  2. 执行在开发环境步骤中,第三步的ALTER TABLE语句。
  3. 将新的字段加入到模型中。 如果你使用了某种版本控制工具,并且在第一步中,已经提交了你在开发环境上的修改,现在,可以在生产环境中更新你的代码了(例如,如果你使用Subversion,执行svn update
  4. 重新启动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 方法中是个不错的主意。

原创粉丝点击