Jan 6, 2012

model in django, sqlite3

python manager.py syncdb 根据 model 创建 tables
但是如果修改了 model (增加/删除/修改 field)或者删除 model,syncdb 不做任何动作
这样会导致错误

django 会验证model和数据库,如果缺失table或field,会提示错误。
但是对于
  1. model 中没有,数据库中有的表格
  2. model 中没有,数据库中有的列
django 不会抱怨

model.Manager

model.objects.
objects 是一个 model manager
In short, a model’s manager is an object through which Django models perform database queries.

默认的manager 是 model.Manager
可以定义自己的manager,继承model.Manager。定义自己的函数

具体参见 Django Book 2.0 第10章

modelAdmin

The ModelAdmin class is the representation of a model in the admin interface. These are stored in a file named admin.py in your application.

modelAdmin 管的是 admin 如何呈现/管理/操作数据。
具体参见
The Django admin site

默认的modelAdmin 为 admin.ModelAdmin。在admin 注册时没声明modelAdmin即使用默认
可以定义自己的,继承admin.ModelAdmin,并在注册时声明

admin.ModelAdmin 定义了很多参数,貌似如果要修改这些参数,就必须继承admin.ModelAdmin

定义自己的 modelAdmin action

modelAdmin.actions: Admin actions 用于对选择的大批记录做某项操作,而非一个一个来。
modelAdmin.actions 是一个函数列表,函数必须接受三个参数
modeladmin, request, queryset

综合上述两点
from django.contrib import admin
from myapp.models import Article

def make_published(modeladmin, request, queryset):
    queryset.update(status='p')
make_published.short_description = "Mark selected stories as published"

class ArticleAdmin(admin.ModelAdmin):
    list_display = ['title', 'status']
    ordering = ['title']
    actions = [make_published]

admin.site.register(Article, ArticleAdmin)

modelAdmin inlines

inlines 用于在 多对一 关系中,用“一来”管理“多”
比如 book 的 publisher 域为 foreignKey 多对一
则可以把 book 作为 publisher 的 inline
参见
The Django admin site

修改 model

修改 model 的解决办法是
1. south
2. 手动修改数据库

手动修改数据库

具体参考 django book 2.0
Chapter 10: Advanced Models

注意如果要增加 not null field
要按如下步骤

  1. 增加 null field
  2. 赋值
  3. 设为 not null

sqlite3

sqlite3 不支持SQL alter column 命令

sqlite3 的使用手册
import sqlite3 as sq

conn = sq.connect('sqlite3.db')

c = conn.cursor()

#c.execute('ALTER TABLE books_book ADD COLUMN status varchar(1)')
#c.execute("UPDATE books_book SET status='d'")
c.execute("ALTER TABLE books_book ALTER COLUMN status varchar(1) NOT NULL")


conn.commit()
print c.fetchall()
c.close()

0 comments: