2012-04-28 139 views
19

我有關於以下模型的問題。我想從views.py中填入ManyToManyField,而不是從管理員那裏填寫。Django:如何將數據保存到ManyToManyField?

但是,如何將數據添加到genres字段即ManyToManyField

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格式問題,但是在製作「內容」時會產生一定程度的縮進。 :)另外,'release_date'應該可以是'DateField'。 – Dougal 2012-04-28 17:59:42

+0

@Dougal,謝謝你的建議。關於縮進,我正在使用一個插件,這對我來說;) – starcorn 2012-04-28 20:22:40

+1

另外,模型中不需要特殊的「id」字段。 Django自動爲你做。 – 2015-09-21 13:09:07

回答

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) 

與修改等領域,這兩種模式必須存在於databa因此在添加多對多關係之前,您必須先致電save。由於add會立即影響數據庫,因此您無需事後保存。

+0

謝謝,我還有一個問題。流派應該是獨一無二的。使用下面的代碼,如果同一流派添加兩次,它將引發錯誤。所以我想知道,我是否應該抓住這個錯誤並做一些事情。或者有更好的方法來排除這個問題嗎? – starcorn 2012-04-28 22:05:44

+0

改爲使用[Model.object.get_or_create](https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create)。 – Jeff 2012-04-29 04:10:50