2011-08-16 33 views
1

我想在我的一個模型中建立一些M2M關係。 Django要求我把related_name的參數放到一些字段中,然後我把它們放進去。但是,我現在對如何獲得相關項目感到困惑。這裏是我的模型簡化。Django M2M與「自我」通過int。表,如何獲得相關項目

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

是集合了交通他們所有Post情況下爲a_post的。

a_post.relevant.all() 

是與交通集中的所有Post實例向他們a_post

你應該真的考慮你的命名約定,這很令人困惑。東西的

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

的關鍵行是Django的SORCE代碼:

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. 

所以你有

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) 

在簡單的SQL ,描述符p.relevancy是讓所有的Post實例,其中ID是

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

通過第一,你的意思是定義字段,或者別的什麼順序?例如,如果我先定義tto,然後定義tfrom,它會有所不同嗎? – yasar

+0

準確。在模型初始化時檢索字段,並將其存儲在模型的Meta類的字段列表中(不要與元類混淆,這是另一個故事),那麼實例上的屬性是一個「描述符」,它使用該字段獲取數據。無論如何,將相關名稱放在事物上將有助於檢測這類問題,因此在任何情況下都可以檢查是否爲事物定義了正確的名稱。 – rewritten

相關問題