【问题标题】:Programmatically identify django foreignkey links but omit through tables以编程方式识别 django 外键链接,但通过表省略
【发布时间】:2012-02-16 20:06:30
【问题描述】:

我问了question earlier to programmatically identity foreignkey links.

我发现下面的代码拉出了所有的一对多链接:

yourModel._meta.get_all_related_objects()

我现在发现的唯一问题是,它还包括用于多对多链接的中间表。因此,如果我有以下模型,

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() 中手动删除它?

问这个问题的另一种方式:如何识别/隔离实际上是“通过”表的链接?

【问题讨论】:

    标签: django many-to-many


    【解决方案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
    

    【讨论】:

    • 我发现 MyModel._meta.get_all_related_objects() 只检索一对多关系。因此,尽管 MyModel._meta.get_all_related_many_to_many_objects() 返回不通过中间表的多对多链接,但将简单的多对多与一对多进行比较是没有帮助的。 MyModel._meta.get_all_related_objects() 返回所有一对多,包括“通过”表。如何只省略直通表?
    【解决方案2】:

    找到了一个 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
    

    这将给出“通过”表的名称

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多