2009-11-18 1 views
17

나는 모든 만화 구매를 기록하는 django 데이터베이스를 만들려고 노력 중이며 몇 가지 문제가 발생했습니다. 저는 만화 쟁점과 그것에 관련된 예술가들 사이의 관계를 모델링하려고합니다.관계에 대한 추가 데이터가있는 many to many 관계

만화 문제에는 한 명 이상의 아티스트가 문제를 해결하고 있으며 아티스트는 두 가지 이상의 문제를 해결합니다. 또한 작가는 만화 제작자 (그 문제에 관한 모든 작업), 작가 (대본 작성), 서랍 (전체 만화 그리기), 연필, 잉크, 색상 또는 텍스트에 대한 역할을 담당합니다. 주어진 역할에 여러 명의 아티스트가있을 수 있습니다. 나는 다음 장고 모델로이 번역 Database model

이 나에게 같은 데이터베이스 모델을 제공

.

1)이 올바른을 보이는가 : 나는 관계에 대한 추가 데이터를 필요로하기 , 나는 내가 관계를 처리하기 위해 별도의 클래스를 사용하고

class Artist(models.Model): 
    name = models.CharField(max_length = 100) 

    def __unicode__(self): 
     return self.name 

class ComicIssue(models.Model): 
    issue_number = models.IntegerField() 
    title = models.TextField() 
    artists = models.ManyToManyField(Artist, through='IssueArtist') 

    def __unicode__(self): 
     return u'issue = %s, %s' % (self.issue_number, self.title) 

class IssueArtist(models.Model): 
    roles = ((0, "--------"), 
       (1, "Creator"), 
       (2, "Writer"), 
       (3, "Drawer"), 
       (4, "Pencils"), 
       (5, "Inks"), 
       (6, "Colours"), 
       (7, "Text"), 
      ) 
    artist = models.ForeignKey(Artist) 
    issue = models.ForeignKey(ComicIssue) 
    role = models.IntegerField(choices = roles) 

내 질문에 추가

가 개최 믿습니다 이 모델링 방법?

2) through='IssueArtist' 기능을 사용하지 않으면 artists.add() 기능을 사용하여 관계를 추가 할 수 있습니다. 이것을 사용하면 'ManyRelatedManager' object has no attribute 'add' 오류가 발생합니다. IssueArtist() 인스턴스를 만들고 관계 테이블을 명시 적으로 검색하여 관계를 수동으로 관리해야합니까? NB. 현재 Django 1.0을 사용 중입니다.

답변

22

Django documentation의 "많은 관련 분야에 관한 내용"섹션을 참조하십시오.이 질문은 정확히 사용자의 질문을 다루고 있습니다.

1 : 예, 중간 모델을 만드는 것이 좋습니다.

2 : 문서에서 : "일반적인 다 대다 필드와 달리 추가, 만들기 또는 할당을 사용하여 관계를 만들 수 없습니다."- 대신 아티스트를 이슈에 추가하려면 중개자 모델 :

some_artist = Artist.objects.get(name='some name') 
some_issue = Issue.objects.get(tile='some tite') 
IssueArtist.objects.create(artist= some_artist, issue = some_issue, role=1) 
+0

이 링크는 내가 찾고 있었지만 찾지 못한 것입니다. 나는 나의 수색 기술을 볼 필요가있다 생각한다. –

+0

이것은 장고의 진짜 '거친 바다'부분입니다. 오류 메시지는 잘못된 것이며 추가/작성 방법은 실제로 예상대로 작동해야합니다. 이 답변을 게시 해 주셔서 감사합니다. – Rich

+2

그냥 create() 메서드를 사용하는 경우 a.save() 불필요한 지적했다. https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.create –