2010-03-15 34 views
6

Hay tôi có câu hỏi về các mối quan hệ.django ManyToMany qua trợ giúp

Tôi muốn Người dùng có tình bạn. Vì vậy, một người dùng có thể là một người bạn với một người dùng khác. Tôi giả sử tôi sẽ cần phải sử dụng ManyToManyField, thông qua một bảng Friendship. Nhưng tôi không thể làm cho nó hoạt động được. Bất kỳ ý tưởng?

Đây là các mô hình của tôi.

class User(models.Model): 
    username = models.CharField(max_length=999) 
    password = models.CharField(max_length=999) 
    created_on = models.DateField(auto_now = False, auto_now_add = True) 
    updated_on = models.DateField(auto_now = True, auto_now_add = False) 
    friends = models.ManyToManyField('self') 
    pendingFriends = models.ManyToManyField('self', through='PendingFriendship', symmetrical=False, related_name='friend_requested') 

class PendingFriendship(models.Model): 
    user = models.ForeignKey('User', related_name='user') 
    requested_friend = models.ForeignKey('User', related_name='requested_friend') 
    created_on = models.DateField(auto_now = False, auto_now_add = True) 
    updated_on = models.DateField(auto_now = True, auto_now_add = False) 

Cảm ơn

Trả lời

6

Nhiều-nhiều lĩnh vực được mô tả trong documentation. Chỉ cần làm:

class User(models.Model): 
    username = models.CharField(max_length=999) 
    password = models.CharField(max_length=999) 
    created_on = models.DateField(auto_now = False, auto_now_add = True) 
    updated_on = models.DateField(auto_now = True, auto_now_add = False) 
    friends = models.ManyToManyField('self') 

Bạn chỉ phải sử dụng through nếu bạn muốn thêm trường bổ sung vào mối quan hệ. Một mô tả khác về tất cả các khả năng được mô tả trong this section.

Khi bạn đặt tên cho kiểu máy là Người dùng, tôi cho rằng bạn không sử dụng tính năng xây dựng trong khung xác thực. Nhưng nếu bạn sử dụng nó, bạn không phải tự mình thực hiện xác thực, vì vậy hãy nghĩ về nó.

Cập nhật: Bạn đã đọc các phần tôi đã liên kết chưa? Có nó được mô tả:

Có một vài hạn chế về mô hình trung gian:

  • mô hình trung gian của bạn phải chứa một - và chỉ có một - chính nước ngoài để mô hình mục tiêu (điều này sẽ là người trong ví dụ của chúng tôi). Nếu bạn có nhiều khóa ngoại, lỗi xác thực sẽ được nâng lên.
  • Mô hình trung gian của bạn phải chứa một - và chỉ một - khóa ngoài cho mô hình nguồn (đây sẽ là Nhóm trong ví dụ của chúng tôi). Nếu bạn có nhiều khóa ngoại, lỗi xác thực sẽ được nâng lên.
  • Ngoại lệ duy nhất cho điều này là một mô hình có mối quan hệ nhiều-nhiều với chính nó, thông qua một mô hình trung gian. Trong trường hợp này, hai khóa ngoại cho cùng một mô hình được cho phép, nhưng chúng sẽ được coi là hai mặt (khác nhau) của quan hệ nhiều-nhiều.
  • Khi xác định quan hệ nhiều-nhiều từ một mô hình cho chính nó, sử dụng mô hình trung gian, bạn phải sử dụng symmetrical=False (xem model field reference).
+0

Tôi đã cập nhật ví dụ, với sửa đổi của bạn. Tuy nhiên tôi vẫn cần thêm bảng để giữ dữ liệu. – dotty

+0

@dotty: Tôi đã cập nhật câu trả lời của mình. –

+1

hmm, ive cập nhật mô hình của tôi, nó vượt qua xác thực tốt. Ive đã thêm một vài Người dùng. và tạo đối tượng PendingFriendship trên mô hình của người dùng A.Điều này cho biết thêm tình bạn tốt đẹp, tuy nhiên đối tượng của người dùng b không nhận được phía bên kia của tình bạn (im asuming vì giá trị 'đối xứng' là sai). Tôi muốn mối quan hệ được đối xứng mặc dù. bất kỳ ý tưởng? – dotty

0

This blog giải thích những gì bạn cần. Từ blog, bạn chỉ cần phải thay đổi related_name trong dòng này:

pendingFriends = models.ManyToManyField('self', through='PendingFriendship', symmetrical=False, related_name='friend_requested') 

thành:

related_name='friend_requested+' 

Tuy nhiên, tôi vẫn không thể có được nó để làm việc tạo mối quan hệ đối xứng tự động.

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