2012-04-28 97 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

相关问题