1

基本上,我在使用遗留数据库时遇到问题,其中我使用的表没有适当的参照完整性(比如没有外键;只是表,但“我”知道它们与某些列相关)。因此,在跨不同的 oracle 用户查询n表时,Django 的框架不会有好处。m

像这样的东西: 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;

现在在 Django 的管理 UI 中,我想显示这个:

---------------------------
| col1  |  col3  |  col2  |
---------------------------
| abcd  |  defg  |  hijk  |
---------------------------
| 1234  |  5678  |  9009  |
---------------------------

我最近才开始使用 Django,因为它的快速开发。因此,非常感谢任何支持或文档。

4

1 回答 1

3

要利用 Django Admin,您需要先创建一个模型,无论它从哪里获取数据。现在,由于我们将模型映射到 DB,您可以基于 DB 视图或三个表(user1.table1、user2.table2 和 user3.table3)中的任何一个创建模型:

基于数据库视图:

首先,创建一个数据库视图来获取col1col2col3从表中获取。
另外,为模型选择一个主键:它可以是数据库视图中的任何(包括额外的)列,只要模型字段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 后FooFoo可以在 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

如果var1ofSELECT * from t1, t2, t3 where ... like '%?%'", [var1])被确定,您可以为 的每个值制作多个模型var1;如果不是,你必须对模型和管理做一些动态的方式,只是参考Django 动态模型字段,这可能更难 IMO。

于 2012-04-29T07:32:41.350 回答