2017-06-03 9 views
0

get_or_create()関数がフォーム内にあるため、新しいデータベースでdjango移行を実行する際に問題があります。Django:フォーム内のオブジェクト参照のために移行できません

form.py

class EmployeeForm(...): 
    # Make sure that we have a directory before initializing the form 
    default_upload_directory = Directory.objects.get_or_create(name='Employee', parent=None)[0] 

これは私が書いたカスタムフォームの重要な部分です。 Employeeのアップロードされたファイルをデフォルトのディレクトリにリンクします。移行以外はすべて正常に動作します。私が新しいデータベースでそれを実行すると、それはdjango.db.utils.OperationalError: no such table: filemanager_directoryと文句を言うでしょう。また、標準objects.get(..)を使用してDirectoryオブジェクトにアクセスすると発生します。

これを解決する方法がわかりません。明らかにテーブルは存在しません。既存のデータベースで、テーブルがすでに配置されていれば、すべて正常に動作します。

編集:私が実行しようとしている移行は、このアプリケーションに関連していません。さらに、回避策として、行をコメントアウトして移行を実行し、それを再開することもできます...しかし、これは純粋な解決策ではありません...

+0

なぜフォームにオブジェクトを作成しようとしていますか? – Pythonista

+0

このフォームは、すべてのアップロードが事前に定義する必要のある特定のディレクトリオブジェクトに接続することを保証します。 – Max

答えて

0

これは、単純に、あなたがすべきことではありません。インポート時に実行されるコードでは、データベースアクセスを実行しないでください。

これは決して行う必要はありません。フォームがインスタンス化されたときにオブジェクトが存在することを確認する場合は、__init__メソッドに入力します。

しかし、データベースオブジェクトが確実に存在することを確認すると、は、最初の場所での移行ジョブです。これを行うには、RunPythonメソッドを使用してデータ移行を作成します。

+0

情報をありがとうございます。しかし、私はむしろそれを忘れないようにしたいと思います。その理由は、他の開発者が一貫したデータフローを維持できるようにできるだけ簡単にしたいからです。それが私たちがこのフォームを作った理由です。これにより、アップロードされたすべてのファイル(複数のアプリケーションで使用される)が正しいディレクトリに確実に添付されます。それは私がそれをこのように好きだった。他の開発者は、必要なModelをプロパティとして設定して移動できます。何かを上書きせずに..編集:私たちが目的のディレクトリを取得するために 'get'だけを使用すると、エラーが発生する – Max

+0

私の答えにどのように対処するのか分かりません。 **インポート時にDB操作を行わないでください**;インスタンス化時または移行時に実行します。 –

+0

私はそれを理解しています。しかし、私はフォームにデフォルトのモデルオブジェクトを割り当てる簡単な方法が必要です。上で説明したように、このために '__init__'をオーバーライドするのは理想的ではありません。 'class Meta'を使ってもうまくいきません。これをどうやって解決しますか?また、オブジェクトの作成だけではありません。オブジェクトを取得するだけで問題はさらに上がります。したがって、移行中に作成することはできません。 – Max

関連する問題