2012-04-28 50 views
19

下記のモデルに関するご質問があります。私はManyToManyFieldを管理者からではなくviews.pyから移入したいと思います。Django:ManyToManyFieldにデータを保存するにはどうすればいいですか?

ManyToManyFieldgenresフィールドにデータを追加するにはどうすればよいですか?

views.py

content = Movie_Info(id = m_id, 
        title = data[0].get('title'), 
        overview = data[0].get('overview'), 
        release_date = data[0].get('release_date'), 
       ) 
content.save() 

models.py

class Movie_Info_genre(models.Model): 
    genre = models.CharField(max_length=100) 

class Movie_Info(models.Model): 
    id    = models.IntegerField(primary_key=True) 
    title   = models.CharField(max_length=100, blank=True, null=True) 
    overview  = models.TextField(blank=True, null=True) 
    release_date = models.CharField(max_length=10, blank=True, null=True) 
    genres   = models.ManyToManyField(Movie_Info_genre) 
+3

Python/Djangoでは、そこにアンダースコアを使用するのではなく、 'MovieInfo'または' MovieInfoGenre'(または単に 'MovieGenre'または' Genre')クラスに名前を付けることを強くお勧めします。また、これはおそらくSOの書式設定の問題ですが、 'content'を作るときにあなたは馬鹿げた量のインデントがあります。 :)さらに、 'release_date'は' DateField'でなければなりません。 – Dougal

+0

@Dougal、アドバイスをいただきありがとうございます。字下げについては、私のためにそれを行うプラグインを使用しています;) – starcorn

+1

プラス、モデルの特別な "id"フィールドの必要はありません。 Djangoは自動的にそれを行います。 –

答えて

31

add method for related fieldsを使用:

# using Model.object.create is a shortcut to instantiating, then calling save() 
myMoveInfo = Movie_Info.objects.create(title='foo', overview='bar') 
myMovieGenre = Movie_Info_genre.objects.create(genre='horror') 
myMovieInfo.genres.add(myMoveGenre) 

他のフィールドを変更することとは異なり、両方のモデルは、に存在する必要がありますデータベースこれを行う前に、多対多リレーションシップを追加する前にsaveに電話する必要があります。追加はすぐにデータベースに影響するため、後で保存する必要はありません。

+0

ありがとう、私はこれにもさらなる質問がありました。ジャンルはユニークであると考えられています。次のコードでは、同じジャンルを2回追加するとエラーが発生します。だから、私はそのエラーをキャッチして、それについて何かをしなければならないのだろうかと思います。あるいは、この問題を解決する良い方法がありますか? – starcorn

+0

[Model.object.get_or_create](https://docs.djangoproject.com/ja/dev/ref/models/querysets/#get-or-create)を代わりに使用してください。 – Jeff

関連する問題