要利用 Django Admin,您需要先创建一个模型,无论它从哪里获取数据。现在,由于我们将模型映射到 DB,您可以基于 DB 视图或三个表(user1.table1、user2.table2 和 user3.table3)中的任何一个创建模型:
基于数据库视图:
首先,创建一个数据库视图来获取col1
,col2
并col3
从表中获取。
另外,为模型选择一个主键:它可以是数据库视图中的任何(包括额外的)列,只要模型字段primary_key=True
与该列匹配,这里我只需选择col1
.
# use Sqlite to create view, Oracle could be similar
CREATE VIEW view_for_legacy_tables AS SELECT t1.col1, t2.col3, t3.col2 from user1.table1 t1, user2.table2 t2, user3.table3 t3 where t1.col1 = t2.col2 AND t2.col2 = t3.col3;
# in model
class Foo(models.Model):
col1 = models.TextField(primary_key=True)
col2 = models.TextField()
col3 = models.TextField()
class Meta:
db_table = 'view_for_legacy_tables'
从现在开始,syncdb
不然南方migrate
可能会抱怨存在,这里干脆不理他们。
您可以通过在 South 中伪造迁移来绕过它,或者将模型从 models.py 移动到未由 models.py 加载的其他文件或函数。
为模型定义相应的 ModelAdmin 后Foo
,Foo
可以在 Django Admin 的更改列表中显示。
如果你想使用 addview 或 changeview 对表格进行一些修改,你可以覆盖模型save
的方法Foo
或自定义 ModelForm,或者自定义 ModelAdmin的add_view
/ change_view
。代码因您的实际使用而异,因此我在这里不提供。
基于表 user1.table1
这与基于 DB 视图的方法类似。为了能够使用 addview 和 changeview,您还需要自定义 ModelForm。
定义模型
class Foo(models.Model):
col1 = models.TextField(primary_key=True)
class Meta:
db_table = 'user1.table1'
然后在 admin.py
class FooAdmin(admin.ModelAdmin):
list_display = ('col1', 'col2', 'col3')
def queryset(self, request): # you could customize the default manager of model Foo
qs = super(FooAdmin, self).queryset(request)
return qs.extra(select={'col2':'user2.table2.col2', 'col3':'user3.table3.col3'},
tables=['user2.table2', 'user3.table3'],
where=['col1 = user2.table2.col2', 'user2.table2.col2'='user3.table3.col3']) # or use `raw()`, depends on your columns
def col2(self, obj):
return obj.col2
def col3(self, obj):
return obj.col3
更新
这种用法非常少见,因此我很少看到有关它的文档。大多数相关的东西都可能在options.py
里面django/contrib/admin
和里面的模型的实现django/db/models/base.py
。
如果你想实现SELECT * from t1, t2, t3 where ... like '%?%'", [var1])
,最简单的方法可能是使用 Admin UI 编写自己的视图,就像https://github.com/dmpayton/django-mongoadmin
如果var1
ofSELECT * from t1, t2, t3 where ... like '%?%'", [var1])
被确定,您可以为 的每个值制作多个模型var1
;如果不是,你必须对模型和管理做一些动态的方式,只是参考Django 动态模型字段,这可能更难 IMO。