2012-02-16 31 views
0

我問了question earlier to programmatically identity foreignkey links.編程識別Django的外鍵鏈接,但通過表省略

我發現下面的代碼翻出所有的一個一對多鏈接:

yourModel._meta.get_all_related_objects() 

現在我發現,雖然唯一的問題是,它也包括要多到interemdiary表 - 多個鏈接。所以如果我有以下型號,

class Model_one(models.Model): 
    name = models.CharField("Name", max_length=30) 
    people = models.ManyToManyField('Model_two', blank=True, through='Association') 

而不是沒有返回,代碼返回關聯。有沒有辦法指定「真正的」一對多鏈接或通過表格忽略?即使我必須從返回的yourModel._meta.get_all_related_objects()手動刪除它?

問另一種方法:如何識別/隔離實際上是「通過」表的鏈接?

回答

1

您可以測試每一項,看它是否在_meta.get_all_related_many_to_many_objects()

related_m2ms = MyModel._meta.get_all_related_many_to_many_objects() 
for related in MyModel._meta.get_all_related_objects(): 
    if related not in related_m2ms: 
     # Do something here with only one-to-many relationships 
+0

我發現MyModel._meta.get_all_related_objects()只檢索一對多的關係。因此,雖然MyModel._meta.get_all_related_many_to_many_objects()返回不通過中間表的多對多鏈接,但將簡單的多對多與一對多比較沒有幫助。 MyModel._meta.get_all_related_objects()返回包括「through」表在內的所有一對多對象。我如何省略直通表? – 2012-02-17 02:00:24

0

發現一個question,導致我在正確的方向:

m2m_links =MyModel._meta.local_many_to_many 
for r in m2m_links: 
    if not r.rel.through._meta.auto_created: 
     print r.rel.through._meta.object_name 

這會給的名字「通過「表