2012-04-28 3 views
19

다음 모델에 관한 질문이 있습니다. 내가 관리자로부터 수행하는 대신 views.py에서 ManyToManyField을 채우고 싶습니다.Django : ManyToManyField에 데이터를 저장하는 방법은 무엇입니까?

그러나 ManyToManyFieldgenres 입력란에 데이터를 어떻게 추가합니까?

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 포맷팅 문제 일 것이지만 'content'를 만들 때 우스운 양의 들여 쓰기가 있습니다. :) 게다가,'release_date'는 아마도'DateField' 일 것입니다. – Dougal

+0

@Dougal, 조언 해 주셔서 감사합니다. 들여 쓰기에 대해서는 저를 위해 플러그인을 사용하고 있습니다.) – starcorn

+1

플러스, 모델에 특별한 "id"필드가 필요 없습니다. 장고가 자동으로 수행합니다. –

답변

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) 

다른 필드를 수정, 두 모델은 존재해야 달리 데이타 바 이 일을하기 전에 save으로 전화를 걸어 다 - 대 - 다 관계를 추가해야합니다. 추가 기능은 데이터베이스에 즉시 영향을 미치기 때문에 나중에 저장할 필요가 없습니다.

+0

고마워, 나는 이것에 대해서도 더 의문을 품었다. 장르는 고유해야합니다. 다음 코드를 사용하면 동일한 장르가 두 번 추가되면 오류가 발생합니다. 그래서 나는 그 오류를 잡아서 그것에 대해 무언가를해야하는지 궁금합니다. 아니면이 문제를 해결할 더 좋은 방법이 있습니까? – starcorn

+0

대신 [Model.object.get_or_create] (https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create)를 사용하십시오. – Jeff

관련 문제