Django Adminを利用するには、データをどこから取得するかに関係なく、最初にモデルを作成する必要があります。ここで、モデルをDBにマッピングしているので、DBビューに基づいてモデルを作成するか、3つのテーブル(user1.table1、user2.table2、user3.table3)のいずれかに基づいてモデルを作成できます。
DBビューに基づく:
col1
まず、テーブルから取得するDBビューを作成しますcol2
。
また、モデルの主キーを選択します。モデルフィールドw /が列と一致する限り、DBビューの任意の(追加の)列にすることができます。ここでは、単にを選択します。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
が存在を不平を言うかもしれない、ここでは単にそれらを無視します。
南での移行を偽造することでそれを回避するか、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はさらに難しくなる可能性があります。