1

我有以下两个模型: 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

表格.py

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

当我运行 syncdbmovies , 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....
4

2 回答 2

3

Django 为多对多字段创建一个单独的表,并引用这两个表。新表必须foreign key同时包含这两个表moviesgenre. 所以你不会看到一个新列,但你肯定会找到一个新表。

因此,每当您添加 时genre,都会为您在表中添加movie的每个新行创建一个新行。genremovies_genre

例如,对于a具有电影id1 的电影,您将流派 b,c 添加到流派ids 1,2,在movie_genre表中创建以下内容

id     movie_id   genre_id
1        1           1 
2        1           2
于 2013-08-09T10:04:22.043 回答
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/

于 2013-08-09T11:51:15.057 回答