2012-02-19 9 views
25

私はRailsの背景から来ていて、Djangoで提供されている "Association Methods"を利用するのに少し問題があります。私はそうのように、(簡潔にするために簡略化されている)は、2つのモデルがあります:Django ManyToMany関係の 'reverse'の使い方は?

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のドキュメントによると:

「のManyToManyFieldを持っているモデルは関係ありません、両方のモデルではなく、どちらか一方のモデルに入れてください。 "

だから私は、私はユーザーと呼ばれるユーザーのインスタンスを持っている場合は、私にできることを理解:

user.companies 

私の質問は、私は逆にどのように行うかありますか?会社のインスタンスに属するすべてのユーザーを取得するには、会社:

company.users # This doesn't work! 

どのような方法がありますか?私が読んだドキュメンテーションは、これを実際にカバーしていません。私は両方の方法で働く協会が必要なので、私は単にそれをあるモデルから別のモデルに移動することはできません。

答えて

48
company.user_set.all() 

User特定の会社に属するオブジェクトのクエリセットを返します。デフォルトでは、関係を逆にmodelname_setを使用していますが、あなたは、モデルを定義するときに、これはすなわち

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

> company.users.all() 

here is the relevant documentation

+0

完璧な答え、パラメータとしてrelated_nameを提供することが迅速な回答に感謝を上書きすることができます。 –

+3

+1のrelated_name。常に* model_set構文を嫌っています。それはとても汚い感じです。 –

+0

私はそれが私に_lazy_を感じると思う。クラス名に基づいて適切な後方関係を推測することは難しいことではありません。 related_nameを使用すると、作業がはるかに簡単になります。 –

関連する問題