2015-12-21 6 views
5

私自身の中間モデルを作成する必要があります。djangoでauto_created属性を正しく使うには?

はAttributeError:次のコードでは、私はエラーがあったので私が使用

class class1(models.Model) 

class class2(models.Model): 
    field1 = models.ManyToManyField(class1, through="class3") 

class class3(models.Model): 
    field1 = models.ForeignKey(class1) 
    field2 = models.ForeignKey(class2) 
    field3 = models.IntegerField() 

    class Meta: 
     auto_created = True 

は「=真auto_created」仲介モデルを指定するのManyToManyFieldに()を追加使用できません。

for m2m_field in self._meta.many_to_many: 
    for m2m_link in getattr(self, m2m_field.get_attname()).all(): 
     getattr(to_object, m2m_field.get_attname()).add(m2m_link) 

今では正常に動作しますが、私はmakemigrationをしようとすると、Djangoは私のClass3の(中間クラス)を削除したい、とclass2のにフィールド1の「スルー」属性を削除します。

私は間違っていますか?どんな解決策ですか?

Tks all。

+0

私はまったく同じ問題を抱えています。私の解決策です(ref:https://stackoverflow.com/questions/28693691/how-to-fake-migrations-for-not-to-create-a-specific-existing -intermediary-table) "makemigrations"を実行して自動生成されたスクリプトを取得し、そこに適用されているメソッドを適用解除して適用解除することで、 "migrate"コマンドを実行するとその操作は実行されません。 – user3099733

答えて

7

私が知る限り、Metaクラスのauto_created属性は文書化されていないため、使用しないでください。

AttributeErrorには、中間モデルを使用する多対多のフィールドにadd()を使用することはできません。正しい解決策は、add()ではなく、中間モデルのインスタンスを作成することです。

class3.objects.create(field_1=c1, field_2=c2, field_3=1). 

詳細はextra fields in many to many relationshipsのドキュメントを参照してください。

+0

はい、djangoドキュメントのauto_created属性については何も見つかりませんでした。ありがとう。 – Raphael

+0

しかし、あなたはなぜジャンゴが私の中間クラスを削除したいのですか? – Raphael

+0

私は 'auto_created'に慣れていないので、なぜDjangoがあなたの中間クラスを削除したいのかわかりません。私はあなたがそれを使用するのをやめると、Djangoは中間クラスをそれ以上削除したくないと思います。 – Alasdair

関連する問題