2011-08-16 8 views
1

私は自分のモデルの中にいくつかのM2M関係を確立しようとしています。 Djangoはfieldsのいくつかにrelated_name引数を付けるように私に依頼しました。しかし、私は今、関連項目を取得する方法と混同しています。ここで私のモデルは単純化されています。intを介して "self"を持つDjango M2M。テーブル、関連アイテムの入手方法

class Post(models.Model): 
    # other fields 
    relevancy = models.ManyToManyField("self",through="Traffic",symmetrical=False,related_name="relevant",blank=True) 

    #some method definitions 

class Traffic(models.Model): 
    tfrom = models.ForeignKey(Post,related_name="tfrom") 
    tto = models.ForeignKey(Post,related_name="tto") 
    count = models.PositiveIntegerField(default=0) 

これは、ユーザーの傾向を分析し、他のユーザーのツールに示唆するものです。私が混乱している部分は、問題の投稿に関連する投稿を得る部分です。たとえば、投稿を選択すると、その投稿からのトラフィックを作成した投稿の集合、またはその投稿などにトラフィッキングされた投稿の集合を取得するにはどうすればいいですか?これは前に投稿したrelated questionです。

PS:英語は私の主な言語ではありません。ご質問がわかりにくい場合は、ごめんなさい。

答えて

1

これは、中間モデル定義に依存します。中間モデルのもみFKは「校長のアクセスを定義するものであるので、

a_post.relevancy.all() 

は彼らからa_postからのトラフィックを持つすべてのPostインスタンスのセットです。

a_post.relevant.all() 

は彼らからa_postへのトラフィックを持つすべてのPostインスタンスのセットです。

あなたの命名規則について考えると、かなり混乱します。

https://code.djangoproject.com/browser/django/trunk/django/db/models/fields/related.py#L1059

    # If this is an m2m-intermediate to self, 
        # the first foreign key you find will be 
        # the source column. Keep searching for 
        # the second foreign key. 

ですから、シンプルなSQLで

s1 = set(my_post.relevancy.all()) 
s2 = set(t.tto for t in my_post.tfrom.select_related('tto')) 
assert not s1.symmetric_difference(s2) 

ことがあります。キーはDjangoのsorceコードである

links = models.ManyToManyField("self", 
      through="Traffic", 
      symmetrical=False, 
      related_name="referrers", 
      blank=True) 

のラインで何か、記述子p.relevancyはIDが最初では

select traffic.tto_id where traffic.tfrom_id = my_post_id 
+0

にあるすべてのPostのインスタンスを取得している、あなたはフィールド、または何か他のものを定義するの順序を意味するのですか?たとえば、最初にttoを、2番目にtを定義すると、違いが生じますか? – yasar

+0

正確に。フィールドはモデルの初期化時に取得され、モデルのメタクラスのフィールドリストに格納されます(メタクラスと混同しないでください)。インスタンスの属性は、フィールドを使用してデータを取得する「ディスクリプタ」です。いずれにしても、関連する名前を物に付けることは、この種の問題を検出するのに役立ちます。したがって、すべての場合に、物事の正しい名前を定義しているかどうかを確認することができます。 – rewritten

関連する問題