Django:表中缺少ManyToManyField

时间:2013-08-09 09:50:23

标签: django

我有以下两种型号: 的 models.py

class Genre(models.Model):
    name = models.CharField(max_length=50, blank=True, unique=True)
    def __unicode__(self):
        return self.name

class Movies(models.Model):
    title = models.CharField(max_length=50, blank=False) 
    plot =  models.CharField(max_length=500, blank=True)
    actors = models.CharField(max_length=200, blank=True)
    director = models.CharField(max_length=100, blank=True) 
    genre = models.ManyToManyField(Genre)


    def __unicode__(self):
        return self.title

forms.py

class MovieForm(forms.ModelForm):
    genre = forms.CharField(widget=forms.TextInput)
    class Meta:
        model = Movies

当我运行syncdb创建movies , genre , movies_genre表时

movies_genre table has (id, movies_id , genre_id)

但是在电影表中,没有为流派字段创建cloumn,这应该是 genre_id

为什么电影表中缺少genre_id字段?

编辑:.................我如何添加数据:

def genre_save(request):
   genre_name = request.POST['genre']
   genre_obj = Genre(name=genre_name)
   genre_obj.save() 
   movie_obj = Movies(genre=genre_obj.id)
   movie_obj.save() // error

TypeError'genre'是此函数的无效关键字参数

def add_movie(request):
    if request.method=="POST":
     genre_save(request)
     form_post = MovieForm(request.POST)
     form_post.save()
     /// other stuff....

2 个答案:

答案 0 :(得分:3)

Django为多个到多个字段创建一个单独的表,并引用这两个表。新表格foreign keymovies两个表都有genre。所以你不会看到一个新专栏,但你肯定会找到一个新的专栏。

因此,无论何时为genre添加movie,都会为genre表中添加的每个movies_genre创建一个新行。

例如,对于电影a 1的电影id,您可以添加带有流派id s 1,2的流派b,c,并在{{1}中创建以下内容}表

movie_genre

答案 1 :(得分:0)

如前所述,Django为多对多字段创建了一个单独的表。此def genre_save(request)函数的重点是什么?为什么你不能在你看来简单地做到这一点?

无论如何,您可以尝试以下方法:

def genre_save(request):
    genre_name = request.POST['genre']
    genre_obj = Genre(name=genre_name)
    genre_obj.save() 
    movie_obj = Movies(name="My Movie")
    movie_obj.save()
    # this is how you should do it
    movie_obj.genre.add(genre_obj)
    # OR like this
    movie_obj.genre = [genre_obj]
    movie_obj.save()

请阅读https://docs.djangoproject.com/en/dev/topics/db/examples/many_to_many/