2010-10-02 34 views
5

Tôi có hai mô hình có mối quan hệ nhiều với một bảng 'qua' theo một cách nào đó?Tôi có thể thêm người quản lý vào mối quan hệ nhiều người không?

class Bike(models.Model): 
    nickname = models.CharField(max_length=40) 
    users = models.ManyToManyField(User, through='bike.BikeUser') 

Lớp BikeUser

class BikeUser(models.Model): 
    bike  = models.ForeignKey(Bike) 
    user  = models.ForeignKey(User) 
    comment = models.CharField(max_length=140) 

Tôi muốn thêm chức năng cho lớp Bike để làm việc với người sử dụng, đó là một cách thực hành tốt nhất để làm điều này. Tôi muốn tránh thêm quá nhiều phương thức cho lớp xe đạp và thay vì có một số loại người quản lý để làm việc thông qua

Cái gì như:

bike.bikeusers_set.commonMethod() 

hoặc

bike.bikeusers.commonMethod() 

Điều gì sẽ là tốt nhất cách để thực hiện điều này?

Trả lời

6

Khi bạn có mô hình BikeUser, bạn có thể thêm người quản lý tùy chỉnh vào mô hình.

Cái gì như:

class BikeUserManager(models.Manager): 
    def commonMethod(): 
     pass 

class BikeUser(models.Model): 
    bike  = models.ForeignKey(Bike) 
    user  = models.ForeignKey(User) 
    comment = models.CharField(max_length=140) 
    objects = BikeUserManager() 

Nhưng bạn chỉ có thể sử dụng nó từ BikeUser mẫu:

BikeUser.objects.commonMethod() 

Những gì bạn muốn là sử dụng quản lý này như một người quản lý có liên quan: http://docs.djangoproject.com/en/dev/topics/db/managers/#controlling-automatic-manager-types

Thêm use_for_related_fields=True vào lớp người quản lý.

class MyManager(models.Manager): 
    use_for_related_fields = True 
+0

Cảm ơn bạn, đã hoạt động như một sự quyến rũ! Howerver, nếu tôi gọi người quản lý từ một chiếc xe đạp đã được instanciated bike.bikeuser_set.commonMethod() Làm cách nào để truy cập "xe đạp" từ bên trong commonMethod? (đây có phải là câu hỏi mới không?) – Joelbitar

+0

Tôi nghĩ bạn sẽ phải thêm nó làm tham số chức năng: def commonMethod (tự, xe đạp) và sử dụng nó như sau: bike.bikeuser_set.commonMethod (xe đạp) – OmerGertel

+0

Thats what I 'v đã làm, tôi nghĩ rằng có một cách tốt hơn, cảm ơn bạn rất nhiều! – Joelbitar

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