Django でデータベース ビューをモデルとして使用できますか?
-
21-08-2019 - |
質問
データベース内に作成したビューを django-view のソースとして使用したいと考えています。
カスタム SQL を使用せずにこれは可能ですか?
******13/02/09 更新***********
多くの回答が示唆しているように、データベース内に独自のビューを作成し、models.py で定義することで API 内でそれを使用することができます。
ただし、いくつかの警告:
- manage.py syncdb は機能しなくなります
- ビューの名前の先頭には、他のすべてのモデル(テーブル)と同じものが必要です。たとえば、アプリが「thing」と呼ばれる場合、ビューは thing_$viewname と呼ばれる必要があります。
解決
Django 1.1 以降、使用できます オプション管理 そのために。
古いバージョンの場合、ビューの Model クラスを簡単に定義し、他のビューと同様に使用できます。Sqlite ベースのアプリを使用してテストしたところ、問題なく動作しているようです。ビューの「主キー」列の名前が「id」でない場合は必ず主キー フィールドを追加し、ビューの名前が「app_classname」でない場合はメタ オプションでビューの名前を指定してください。
唯一の問題は、Django がテーブルを作成しようとするため、「syncdb」コマンドによって例外が発生することです。これを防ぐには、models.py とは異なる別の Python ファイルで「ビュー モデル」を定義します。こうすることで、Django は、アプリ用に作成するモデルを決定するために models.py をイントロスペクトするときにそれらを認識しないため、テーブルを作成しようとしません。
他のヒント
単に更新者の事態に遭遇この質問からGoogleなど)...
現在、Djangoシンプルな"適正に" 定義モデルの管理データベースのテーブル:
オプション管理
デフォルト
True
, とを意味Djangoを作成し、適切なデータベースのテーブルsyncdb
取引の一環として、reset
管理コマンドです。それは、Django 管理 データベースのテーブルのライフサイクルの場合
False
, は、データベースのテーブル作成または削除操作を行いこのモデルです。これがなければならないときに便利で、モデルは既存のテーブルまたはデータベースを眺めることにより作られている。この のみ 時差異managed
はFalse
.その他の全ての側面をモデルに取り扱いて同じとします。
私はただのPostgres 9.4とDjango 1.8でビューを使用してモデルを実装します。
私はこのようなカスタムのマイグレーションクラスを作成します:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_previousdependency'),
]
sql = """
create VIEW myapp_myview as
select your view here
"""
operations = [
migrations.RunSQL("drop view if exists myapp_myview;"),
migrations.RunSQL(sql)
]
私は通常どおりにモデルを書きました。それは私の目的のために動作します。
注 - 私はmakemigrationsを実行したときに新しい移行ファイルが、私は手動で削除モデル、のために作成されました。
。フル私の見解は、私はjsonbデータ型から派生したビューを使用していますし、INSTEADルールにアップデートを書いていないという理由だけで読み込まれdisclosure-ます。
私たちは、ジャンゴの単一のデータベースの制限を回避するためのMySQLと私たちのアプリケーションでは、かなり広範囲にこれをやりました。私たちのアプリケーションは、単一のMySQLインスタンスに住むデータベースのカップルを持っています。私たちは、クロスデータベースモデルがいる限り、我々は「現在の」データベースの各テーブルのビューを作成してきたように、このように合流達成することができます。
限りビューに挿入/更新が行くように、私たちのユースケースでは、ビューは、「[db.table]から選択*;」基本的にあります。言い換えれば、我々は、任意の複雑な結合やフィルタリングそう挿入/更新が(保存からトリガしません)うまく動作します。ご利用の場合は、そのような複雑な結合または大規模なフィルタリングが必要な場合、私はあなたが読み取り専用のシナリオに何の問題もありません疑うが、挿入/更新の問題に遭遇することがあります。私は等の複雑なフィルタを持って、テーブルを横断ビューに更新することを防ぐMySQLでいくつかの根本的な制約があると思います。
とにかく、あなたは、MySQL以外のRDBMSを使用している場合は、あなたの走行距離は異なる場合がありますが、そのは、物理テーブルまたはビューの上に座っている場合Djangoは本当に気にしません。実際にあなたが期待するように機能するかどうかを決定するRDBMSになるだろう。以前のコメンターが指摘したように、我々は成功しジャンゴで作成された物理テーブルを削除し、私たちの「ビューの作成...」コマンドを実行し、ポストsyncdbの実行信号とその周りに働いていたが、あなたはおそらく、窓の外syncdbの実行を投げることがあります。しかし、ポストsyncdbの実行信号は、それが同様に存在トリガので、警告買い手を取得するようにビット難解である。
EDIT:「ポストsyncdbの実行信号」によって、もちろん私が意味する「ポストsyncdbの実行リスナー」
Djangoの公式ドキュメントから、あなたはこのようなビューを呼び出すことができます:
#import library
from django.db import connection
#Create the cursor
cursor = connection.cursor()
#Write the SQL code
sql_string = 'SELECT * FROM myview'
#Execute the SQL
cursor.execute(sql_string)
result = cursor.fetchall()
それがお役に立てば幸いです; - )