2017-12-05 6 views
0

私は別のモデルから外部キーの値を取得し、それを購読したいと考えています。 フィールドがForeignKeyと宣言されているときに機能しますが、フィールドがManyToManyFieldと宣言されても機能しません。 どうすればいいですか?ManyToManyFieldの場合に別のモデルから値を取得

助けてください。

class Document(models.Model): 
    project = models.ForeignKey(Project) 
    text = models.ForeignKey(Text, null=True, blank=True) 
    language = models.ManyToManyField(Language, null=True, blank=True) 

    def save(self, *args, **kwargs): 
     self.text = self.project.text      #WORKS 
     self.language = self.project.language.all()  #NOT WORKS 
     super(Document, self).save(*args, **kwargs) 

答えて

0

このようなことはありますか?

class Document(models.Model): 
    project = models.ForeignKey(Project) 
    text = models.ForeignKey(Text, null=True, blank=True) 
    languages = models.ManyToManyField(Language) # no need to null/blank + put the name on plural if using a many to many relation. 

    def save(self, *args, **kwargs): 
     self.text = self.project.text 
     super(Document, self).save(*args, **kwargs) 

     # super() must be called BEFORE feeding your many to many. 
     project_languages = self.project.languages.all() 
     self.languages.add(*project_languages) 

多くのフィールド属性に多くを使用する場合は、あなたがあなたのインスタンスを待つ必要があるが、多くの属性にあなたの多くの値を追加する前に作成されます。 外部キーフィールドとは異なり、addでこれを行います。

+0

それが動作しませ:( 'プリント(self.language.allを())'すべての後に言語の正しい配列を返しますが、管理者のフォームオプションで選択されていないと、エラーは何データベース – pelcomppl

+0

に保存されていない? –

+0

'印刷(self.language.all()) 'はすべて正しい言語配列を返しますが、オプションは管理フォームで選択されず、データベースに保存されません – pelcomppl

0

あなたはあなたが多対多の関係を追加する前にsaveを呼び出す必要があります

# call save method of super class before adding values to many-to-many 
super(Document, self).save(*args, **kwargs) 
p_language = self.project.language.all() 
self.language.add(*p_language) 

へのManyToManyField

変更にこのライン

# use plural naming convention when its ManyToMany relation `language` should be `languages` in your Document model 
self.language = self.project.language.all() 

を初期化するための.add()を使用する必要があります。追加はすぐにデータベースに影響するため、後で保存する必要はありません。

関連する問題