2009-11-18 50 views
17

Tôi đang cố gắng tạo cơ sở dữ liệu django ghi lại tất cả các giao dịch mua truyện tranh của mình và tôi đã gặp phải một số sự cố. Tôi đang cố gắng mô hình hóa mối quan hệ giữa vấn đề truyện tranh và các nghệ sĩ làm việc trên đó.Nhiều mối quan hệ với dữ liệu bổ sung về mối quan hệ

Vấn đề về truyện tranh có một hoặc nhiều nghệ sĩ đang khắc phục sự cố và nghệ sĩ sẽ làm việc trên nhiều vấn đề. Ngoài ra, các nghệ sĩ có một vai trò liên quan đến những gì họ đã làm trên tác giả truyện tranh (tất cả công việc về vấn đề đó), nhà văn (viết kịch bản), ngăn kéo (vẽ truyện tranh hoàn chỉnh), bút chì, mực, màu sắc hoặc văn bản, và có thể có một số nghệ sĩ trong một vai trò nhất định.

này mang lại cho tôi một mô hình cơ sở dữ liệu như: Database model

sau đó tôi dịch này vào mô hình Django sau. Như tôi đã yêu cầu dữ liệu bổ sung về mối quan hệ, tôi tin rằng tôi phải sử dụng một lớp riêng biệt để xử lý các mối quan hệ, và giữ thêm

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) 

Câu hỏi của tôi là:

1) Điều này có vẻ đúng cách mô hình hóa điều này?

2) Nếu tôi không sử dụng tính năng through='IssueArtist', tôi có thể thêm mối quan hệ bằng cách sử dụng chức năng artists.add(). Nếu tôi sử dụng điều này, tôi gặp lỗi 'ManyRelatedManager' object has no attribute 'add'. Tôi có phải tự quản lý mối quan hệ bằng cách tạo ra IssueArtist() trường hợp và tìm kiếm một cách rõ ràng bảng quan hệ không? NB. Tôi đang sử dụng Django 1.0, tại thời điểm này

Trả lời

22

Tôi khuyên bạn nên xem phần "EXTRA FIELDS ON MANY-TO-MANY RELATIONSHIPS" trong Django documentation - nó bao gồm chính xác câu hỏi của bạn.

1: có, tạo mô hình trung gian là cách để thực hiện.

2: Từ tài liệu: "Không giống như trường nhiều người bình thường, bạn không thể sử dụng thêm, tạo hoặc gán để tạo mối quan hệ" - Thay vào đó, để thêm Nghệ sĩ vào vấn đề, hãy làm từ trung gian mô hình:

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

Liên kết đó chính xác là những gì tôi đang tìm kiếm và không tìm thấy. Tôi nghĩ tôi cần phải xem xét kỹ năng tìm kiếm của mình. –

+0

Đây là một phần 'biển thật' của Django. Thông báo lỗi là gây hiểu lầm và các phương pháp thêm/tạo thực sự sẽ hoạt động như mong đợi. Cảm ơn bạn đã đăng câu trả lời này. – Rich

+2

chỉ ra rằng a.save() là không cần thiết nếu bạn đang sử dụng phương thức create(). https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.create –

Các vấn đề liên quan