2010-10-02 7 views
5

Tengo dos modelos que tienen una relación manytomany con una tabla 'directa' de alguna manera?¿Puedo agregar un administrador a una relación manytomany?

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

La clase BikeUser

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

me gustaría agregar funcionalidad a la clase de bicicletas para trabajar con los usuarios, hay una mejor manera práctica de hacer esto. Me gustaría evitar la adición de demasiados métodos a la clase de bicicletas y más bien tener algún tipo de gestor de trabajar a través de

Algo así como:

bike.bikeusers_set.commonMethod() 

o

bike.bikeusers.commonMethod() 

¿Cuál sería la mejor forma de lograr esto?

Respuesta

6

Una vez que tenga el modelo BikeUser, puede agregar un administrador personalizado al modelo.

Algo así como:

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

Pero sólo se puede usar desde el Modelo BikeUser:

BikeUser.objects.commonMethod() 

Lo que se quiere es utilizar este gerente como gerente relacionada: http://docs.djangoproject.com/en/dev/topics/db/managers/#controlling-automatic-manager-types

Agregue use_for_related_fields=True a la clase de administrador.

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

¡Gracias, eso funcionó como un encanto! Howerver, si llamo al administrador desde una bicicleta instanciada bike.bikeuser_set.commonMethod() ¿Cómo accedo a la "bicicleta" desde el método común? (¿Debería ser esta una pregunta nueva?) – Joelbitar

+0

Creo que tendrá que agregarlo como un parámetro de función: def commonMethod (self, bike) y usarlo así: bike.bikeuser_set.commonMethod (bike) – OmerGertel

+0

Eso es lo que 'V estado haciendo, pensé que había una mejor manera, muchas gracias de todos modos! – Joelbitar

Cuestiones relacionadas