2016-10-18 10 views
1

私はpkmanytomanyのフィールドを持つDjangoのモデルを持っています。このmanytomanyはモデル自体を参照します。Djangoは中間テーブル(manytomany)のフィールドに間違った型を作成します

私がmakemigrationを実行したとき、わかりませんでしたが、中間テーブルのフィールドはchar(N)として作成されませんでした。実際には、integerとして作成されます。

# models.py 
class Inventory(models.Model): 
    sample_id = models.CharField(max_length=50, primary_key=True) 
    parent_id = models.ManyToManyField("self") 

これは、私が作成した、inventory_parent_id、中間テーブル内のフィールドを見て、私は私の親モデル

>>> p = Inventory.objects.get(sample_id='sample01') 
>>> child = Inventory.objects.get(sample_id='sample02') 
>>> p.parent_id.add(child) 

にオブジェクトを追加しようとするたびに、私はエラー

psycopg2.DataError: invalid input syntax for integer: "sample02" 
LINE 1: ...HERE ("inventory_parent_id"."to_inventory_id" IN ('sample... 

を取得し、エラーをスローしますDjangoの型が正しくない。

Columns (3) 
|--id (integer) 
|--from_inventory_id (integer) 
|--to_inventory_id (integer) 

私の質問はです:私は手動タイプを変更した場合、それは悪いですか?移行が壊れますか?あるいは、私は何かをしなければならなかったので、Djangoはこの誤解を招くタイプをキャッチできますか?

答えて

0

は、(約.pycファイルを忘れないように)して、もう一度それを生成する移行ファイルを削除する(それが最初の移行だ場合./manage.py migrate YOURAPP PREVIOUS_MIGRATION_NUMBER./manage.py migrate YOURAPP zeroを使用して適用を解除する移行)移行を再作成してください。

それでも問題が解決しない場合は、適切な移行フィールドを持つカスタムスルーテーブルを作成し、その移行を再作成してみてください。

+0

私は問題がどこから来ているのか知っていると思います。私は最初に「manytomany」というフィールドを作り、「makemigrations」+「migrate」を実行しました。次に、フィールドのpkをcharフィールドに変更し、Djangoは中間テーブルへの変更を認識しませんでした。私は前の2つに移行を偽って、やり直します。 – mk2

+0

答えは私がする必要があるものではありませんが、私は受け入れられたとマークしました。私の前のコメントとまったく同じように起こった。私は2つ前の1つに移行を偽造し、pkの変更のための移行を作成し、その後、フィールドをmanytomanyに変更する別の移行を作成しました。フィールドidが削除できないと不平を言っていたので、1回の移行でそれを行うことはできませんでした... – mk2

関連する問題