【问题标题】:Get the ORM that is created by Django获取 Django 创建的 ORM
【发布时间】:2013-09-30 10:25:53
【问题描述】:

来自 Django 文档:

后向关系如何可能?

其他对象关系映射器要求您在 双方。 Django 开发人员认为这违反了 DRY (Don't Repeat Yourself) 原则,所以 Django 只要求你 在一端定义关系。

但这怎么可能,因为模型类不知道哪个 其他模型类与之相关,直到那些其他模型类 加载了吗?

答案在于 INSTALLED_APPS 设置。任何第一次 模型被加载,Django 遍历 INSTALLED_APPS 中的每个模型 并根据需要在内存中创建后向关系。 本质上,INSTALLED_APPS 的功能之一就是告诉 Django 整个模型域。

有没有办法得到这个 ORM 模型?我正在尝试调试一些不是自动创建的反向关系,这将有助于查看 Django 创建的整个 ORM。

【问题讨论】:

    标签: django orm django-models


    【解决方案1】:

    没有特定的 ORM“模型”,但是有一些东西可以帮助你。

    from django.db.models.loading import get_models
    

    get_models() 将为您返回每个已注册模型的列表,此列表就是您所描述的循环机制。

    YourModel._meta.get_all_related_objects_with_model()
    

    此函数循环遍历每个已注册模型中的每个字段,并找到任何反向关系并将其返回到您的 YourModel

    来自django.db.models.optionsOptions 类(YourModel._meta 是一个Options 对象)是寻找这些东西的好地方。

    【讨论】:

    • 是的! get_models 正是我们想要的。我有一个 Django 项目包括另一个 Django 项目。原来我需要把相关模型放到包含项目的INSTALLED_APPS中。因为我在基础项目中进行数据库同步,所以直到现在我才遇到没有它的问题。谢谢。
    【解决方案2】:

    Django 没有“创建” ORM,所以这个问题没有意义。如果您想知道 ORM 为您的模型类添加了哪些属性以支持反向关系,那么您可以

    1. 打开 django shell,导入模型并检查它们
    2. 阅读源代码(嘿,它是开源的不是吗?)
    3. 如果这还不够,请在适当的位置添加断点并通过调试器运行整个事情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 2018-09-25
      • 2015-12-27
      • 2013-07-27
      • 1970-01-01
      相关资源
      最近更新 更多