1

基本的に、使用しているテーブルに適切な参照整合性がないレガシーデータベースでの作業に問題があります(外部キーがないなど、テーブルだけですが、「いくつかの列によって関連付けられていることはわかっています」)。したがって、Djangoのフレームワークは、さまざまなoracleユーザーn間でテーブルをクエリする場合には有益ではありません。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ビューに基づいてモデルを作成するか、3つのテーブル(user1.table1、user2.table2、user3.table3)のいずれかに基づいてモデルを作成できます。

DBビューに基づく:

col1まず、テーブルから取得するDBビューを作成しますcol2。 また、モデルの主キーを選択します。モデルフィールドw /が列と一致する限り、DBビューの任意の(追加の)列にすることができます。ここでは、単にを選択します。col3
primary_key=Truecol1

# 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が存在を不平を言うかもしれない、ここでは単にそれらを無視します。
南での移行を偽造することでそれを回避するか、models.pyからmodels.pyによってロードされない他のファイルまたは関数にモデルを移動することができます。

Fooモデルに対応するModelAdminを定義した後、DjangoAdminのFooチェンジリストに表示される可能性があります。

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にあり、Modelの実装は内部にありdjango/db/models/base.pyます。

達成したい場合SELECT * from t1, t2, t3 where ... like '%?%'", [var1])、おそらく最も簡単な方法は、https://github.com/dmpayton/django-mongoadminのように、管理UIを使用して独自のビューを作成することです。

var1のが決定された場合、 ;SELECT * from t1, t2, t3 where ... like '%?%'", [var1])の値ごとに複数のモデルを作成できます。var1そうでない場合は、モデルと管理について動的な方法を実行する必要があります。Django動的モデルフィールドを参照するだけで、IMOはさらに難しくなる可能性があります。

于 2012-04-29T07:32:41.350 に答える