2010-10-02 80 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

相关问题