web-dev-qa-db-ja.com

djangoデータベースのないモデル

自動設定では、models.pyで定義したモデルをデータベーステーブルにすることを知っています。

テーブルではないモデルを定義しようとしています。ユーザーが何かを検索するたびに、APIから取得して構成する動的データを保存する必要があります。このデータはアセンブルする必要があり、ユーザーが終了すると破棄されます。

以前は、これにデータベーステーブルを使用していました。 「Trips.objects.all」などの操作を任意のビューで実行し、それをすべてのテンプレートに渡すことができました。これは、すべて1つのデータソースからのものだからです。モデルのインスタンス化を「保存」できないだけでデータベースに保存できないと聞きましたが、このデータ(1つのビューにまとめたもの)や他の複数のビューにアクセスして、それを操作して表示します。 。 。保存しないとアクセスできません、保存するとデータベースに保存されます(複数のユーザーで同時実行の問題が発生します)

私は本当に辞書/リストを渡したくありません、そして私がしなければならなかった場合、どうやってそれをしたのかさえわかりません。

アイデア?

ありがとう!

30
dlitwak

別のオプションは、使用することです:

class Meta:
    managed = False

Djangoがデータベーステーブルを作成しないようにします。

https://docs.djangoproject.com/en/1.9/ref/models/options/#managed

17
andorov

通常の Class のように聞こえます。

必要に応じてmodels.pyに入れることができます。Django.db.models.Modelでサブクラス化しないでください。または、任意のpythonファイルにインポートして、使用したい場所のスコープにインポートすることもできます。

おそらく ミドルウェア を使用して、リクエストが到着したときにインスタンス化し、リクエストが完了したときに破棄します。アクセス戦略の1つは、それを要求オブジェクト自体に添付することですが、ymmvを使用します。

11
John Mee

SQLAlchemyとは異なり、DjangoのORMはデータベースバックエンドのないモデルでのクエリをサポートしていません。

選択できるのは、SQLiteインメモリデータベースの使用、またはDjangoのORMに純粋なインメモリバックエンドを提供する dqms のようなサードパーティアプリケーションの使用に限定されます。

5
Burhan Khalid

Djangoの cache framework を使用してデータを保存し、ビュー間で共有します。

1
Mariusz Jamro

データをメモリに保存し、別のアプリケーションとなるキャッシュが必要です。

Djangoでは、memcache、データベースバックエンド、redisなどのさまざまなキャッシュバックエンドを使用できます。基本的なクエリ機能と並べ替え機能が必要なため、 Redis をお勧めします。 Redisはパフォーマンスが高く(memcache以下)、データ構造(文字列/ハッシュ/リスト/セット/ソート済みセット)をサポートしています。

Redisはデータベースに置き換わるものではありませんが、データを効率的にクエリするためにキーを準備する必要があるKey-Valueデータベースモデルに適しています。Redisはキーのクエリのみをサポートしているためです。

For example, user 'john.doe' data is: key1 = val1
The key would be - john.doe:data:key1
Now I can query all the data for for this user as - redis.keys("john.doe:data:*")

Redisコマンドは http://redis.io/commands で入手できます。

Django Redisキャッシュバックエンド: https://github.com/sebleier/Django-redis-cache/

0
Ravi Kumar

データベースまたはファイルベースの sessions を使用してみてください。

0