2012-02-19 18 views
25

Rails arka planından geliyorum ve Django'da sağlanan "İlişkilendirme Yöntemleri" ni kullanarak biraz sorun yaşıyorum. Öyle gibi (kısa olması için basitleştirilmiştir) iki model vardır:Django ManyToMany ilişkisinin tersini nasıl kullanılır?

class User(models.Model): 
    username = models.CharField(max_length=100, unique=True) 
    companies = models.ManyToManyField('Company', blank=True) 

class Company(models.Model): 
    name = models.CharField(max_length=255) 

Django belgelerine göre:

"ManyToManyField sahip olan modeli önemli değil, ama sadece bir modele koymalısınız - her ikisine de değil.

Ben de bir Kullanıcı örneğini varsa, kullanıcı adı verilen, yapabileceğim anlıyoruz:

user.companies 

Sorum ben ters yapmalıyım nasıl?

company.users # This doesn't work! 

ne kongre bunun için var: Nasıl Şirket anına ait tüm kullanıcıları alırım, en Firma diyelim? Okuduğum belgeler gerçekten bunu kapsamıyor. Her iki yönde çalışmak için derneğe ihtiyacım var, bu yüzden onu bir modelden diğerine taşıyamam.

cevap

48
company.user_set.all() 

belirli şirkete ait User nesnelerin Sorgu Kümesi dönecektir. Varsayılan olarak size ilişkiyi tersine çevirmek için modelname_set kullanmak, ancak, modelini tanımlarken bu yani

class User(models.Model): 
    companies = models.ManyToManyField(User, ..., related_name="users") 

> company.users.all() 

here is the relevant documentation

+0

Mükemmel cevap, bir parametre olarak bir related_name sağlamış hızlı cevap için teşekkür geçersiz kılabilir. Related_name için –

+3

+1. Her zaman * nefret edilen 'model_set' sözdizimi. Çok kirli bir duygu. –

+0

Sanırım bana _lazy_ hissediyor. Sınıf isimlerine göre uygun bir geriye doğru ilişki bulmak zor değildir. Related_name ile çalışmayı çok daha kolay hale getirir. –

İlgili konular