我有以下两种型号: 的 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....
答案 0 :(得分:3)
Django为多个到多个字段创建一个单独的表,并引用这两个表。新表格foreign key
和movies
两个表都有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/