2010-10-02 30 views
5

Bir yoldan 'geçiş' tablosuyla bir çok-erkek ilişkisi olan iki modelim var mı?Çok-kuruluşlu bir ilişkiye yönetici ekleyebilir miyim?

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

BikeUser sınıf

class BikeUser(models.Model): 
    bike  = models.ForeignKey(Bike) 
    user  = models.ForeignKey(User) 
    comment = models.CharField(max_length=140) 
Ben kullanıcılarla çalışmak için bisiklet sınıfına işlevsellik eklemek istiyorum

, bunu yapmanın en iyi yöntem yolu yoktur.

bike.bikeusers_set.commonMethod() 

veya

bike.bikeusers.commonMethod() 

iyi olurdu Ne: Ben Bisiklet sınıfına çok fazla yöntem eklemekten kaçının ve oldukça benzeri

Something aracılığıyla çalışmak üzere yöneticiye çeşit istiyorum Bunu başarmanın yolu?

cevap

6

BikeUser modeline sahip olduğunuzda, modele özel bir yönetici ekleyebilirsiniz.

şey gibi:

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

Ama sadece BikeUser Modeli onu kullanabilirsiniz: http://docs.djangoproject.com/en/dev/topics/db/managers/#controlling-automatic-manager-types

:

BikeUser.objects.commonMethod() 

Ne istiyorsun ilgili yöneticisi olarak bu yöneticisini kullanmaktır

Yönetici sınıfına use_for_related_fields=True ekleyin.

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

Teşekkür ederim, bu bir çekicilik gibi çalıştı! Howerver, müdürü bir bisikletle çağırırsam bike.bikeuser_set.commonMethod() CommonMethod içinden "bisiklet" e nasıl erişirim? (Bu yeni bir soru olmalı mı?) – Joelbitar

+0

Sanırım bir işlev parametresi olarak eklemeniz gerekecek: def commonMethod (self, bisiklet) ve bunu böyle kullan: bike.bikeuser_set.commonMethod (bike) – OmerGertel

+0

Thats what I 'v yapıyordum, daha iyi bir yol olduğunu düşündüm, yine de çok teşekkürler! – Joelbitar

İlgili konular