web-dev-qa-db-ja.com

Django選択的ダンプデータ

Djangoのdumpdata管理コマンドの出力を選択してフィルタリングすることは可能ですか?それぞれ数百万行のモデルがいくつかあり、特定の基準に適合する1つのモデルのレコードと、それらのレコードのいずれかを参照するすべての外部キーにリンクされたレコードのみをダンプしたいと思います。

このユースケースを検討してください。たとえば、ユーザーモデルに数百万のレコードが含まれる本番データベースがあったとします。他のいくつかのモデル(ログ、トランザクション、購入、ブックマークなど)があり、すべてUserモデルを参照しています。 Djangoアプリで開発を行い、現実的なデータを使用してテストしたいのですが、実稼働データベースは非常に大きいため、全体のスナップショットを現実的にとることができず、ローカルにロードするので、理想的には、dumpdataを使用して50個のランダムなユーザーレコードと関連するすべてのレコードをJSONにダンプし、それを使用して開発データベースにデータを入力します。

これを達成する簡単な方法はありますか?

38
Cerin

Django-fixture-magic は一見の価値があると思います。

Djangoデータベース をスクラブすると、追加の背景情報が見つかります。

21
arie

このスニペットはあなたに役立つかもしれません(関係を追跡し、それらをシリアル化します):

http://djangosnippets.org/snippets/918/

また、その管理コマンドを使用して、カスタムクエリセットを返すモデルのデフォルトマネージャーをオーバーライドすることもできます。

6
Phil Avery

これは私の質問に対する単純な答えではありませんが、Djangoの組み込み ナチュラルキー機能 で興味深いドキュメントを見つけました。これにより、主キーなしでシリアル化されたレコードを表すことができます。残念ながら、これはdumpdataに完全に統合されているようには見えません。また、自然キーに完全に依存するための古い 未解決のチケット があります。

また、serializers.serialize()関数は、特定のモデルインスタンスの任意のリストのシリアル化を許可するようです。

おそらく、私がすべてのモデルにnatural_key()メソッドを実装してから、serializers.serialize([Users.objects.filter(criteria)])を呼び出した場合、目的に近いものになるはずです。すべてのFK参照をクロールして、serialize()に渡されるオブジェクトのリストにそれらを含める関数を作成する必要があるかもしれません。

3
Cerin