2012-02-16 33 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 

这会给的名字“通过“表