2010-10-02 98 views
5

我有兩種模式,以某種方式與'through'表有許多關係?我可以將經理添加到多人關係嗎?

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

的BikeUser類

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

我想將功能添加到Bike類與用戶的工作,有沒有這樣做的最佳實踐方法。我想,以避免增加過多的方法來Bike類和相當有某種經理通過

喜歡的東西的工作:

bike.bikeusers_set.commonMethod() 

bike.bikeusers.commonMethod() 

什麼是最好的方法來完成這個?

回答

6

擁有BikeUser模型後,您可以將自定義管理器添加到模型中。

喜歡的東西:

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() 

但是,你只能用它從BikeUser型號:

BikeUser.objects.commonMethod() 

你想要的是用這個經理爲相關經理: http://docs.djangoproject.com/en/dev/topics/db/managers/#controlling-automatic-manager-types

use_for_related_fields=True添加到經理類。

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

謝謝,這就像一個魅力工作! Howerver,如果我從instanciated Bike呼叫經理 bike.bikeuser_set.commonMethod() 如何從commonMethod內訪問「bike」? (這應該是一個新問題嗎?) – Joelbitar 2010-10-02 18:19:40

+0

我想你必須添加它作爲一個函數參數:def commonMethod(self,bike)並且像這樣使用它:bike.bikeuser_set.commonMethod(bike) – OmerGertel 2010-10-02 18:57:49

+0

那就是我'v一直在做,我認爲有更好的辦法,非常感謝你! – Joelbitar 2010-10-02 20:38:57

相關問題