1

私は次の2つのモデルを持っています: 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

syncdb を実行すると、movies , genre , movies_genreテーブルが作成されます

movies_genre table has (id, movies_id , genre_id)

ただし、moviesテーブルでは、 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映画1 の映画の場合、ジャンルs 1,2 でidジャンル b,c を追加すると、テーブルに次のものが作成されます。idmovie_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 に答える