【问题标题】:How does one find all models with relations to a specific model with django's orm?如何使用 django 的 orm 找到与特定模型相关的所有模型?
【发布时间】:2011-07-25 16:36:47
【问题描述】:

我需要合并一个模型的两个实例,我需要经历的过程相当简单。系统中没有多少标准化数据。要将两者结合起来,我只需要合并数据,并在任何相关模型上设置相关的 foreign_keys。

问题在于尽量让应用保持“可重用”。我不想在任何时候添加另一个可能与这个模块一起使用的模型时编辑这个模块。有没有办法获取具有另一个特定模型的外键的模型列表?以及相关的领域是什么?

此外,返回此根模型的许多链接将通过通用外键。但是我假设找到链接到根对象的模型将有助于找到链接到 ContentTypes 模型的模型。

【问题讨论】:

  • 我对照片模型有类似的问题,需要了解特定照片的每次此类使用(权限管理问题)。我发现的唯一方法是通过每个对象链发出单独的查询。我很想知道是否还有更好的方法,因为它确实感觉不对并且非常违反 DRY。

标签: django orm


【解决方案1】:

您也许可以通过自省来解决这个问题,但是您将模型与 Django 实现紧密耦合,这可能很危险。如果您对此感到满意,则可以按照以下方式做一些事情:

class MyModel(models.Model):
    ## Definitions
    @property
    def related(self):
        related = []
        for attr in dir(self):
            try:
                ## Get the class name.
                attr_type = type(bf.__getattribute__(attr)).__name__
                ## This is an internal type tucked away in:
                ##     django/db/models/fields/related.py
                ##   As best I can tell, this is only used for reverse
                ##   relationships.
                if attr_type == "RelatedManager":
                    related.extend(bf.__getattribute__(attr).all())
            except:
                ## Some of the built in methods / properties throw errors,
                ##   skip them.
                pass
        return related

可能不是最好的解决方案,但它似乎在测试中有效。

【讨论】:

  • 它至少比直接引用每个关系要好,但你是对的,因为它使用了潜在的移动目标 Django 内部。尽管如此,仍然没有解决访问数据库 100 次以收集所有内容的主要问题,但可能不会解决这个问题。
  • 没有太大帮助,因为大多数关系都是通用的,我想我必须跟踪并手动更新可能需要更新的模型列表:-/
  • 您可以将这样的列表放在settings.py 中,这样可以保证您的应用程序可重用。
猜你喜欢
  • 2019-07-27
  • 2021-11-20
  • 2018-05-31
  • 2019-05-01
  • 2021-07-27
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多