在 Django 应用程序之间共享模型

Posted

技术标签:

【中文标题】在 Django 应用程序之间共享模型【英文标题】:Sharing models between Django apps 【发布时间】:2011-05-07 10:36:12 【问题描述】:

我会简单地说:为了按照 Django 应用程序的精神和理念工作,一个应用程序可以从另一个应用程序中导入模型吗?比如说,用户统计应用程序将从用户应用程序导入模型,例如:from users.models import users

【问题讨论】:

请注意,在 django 中模型名称应该是单数。 【参考方案1】:

答案是肯定的。 django 项目中的一个应用程序从另一个应用程序导入模型是完全可以的。 django 项目的强大之处在于应用程序及其交互。

还要确保您有实用程序应用程序从更通用的应用程序而不是其他方式导入模型。所以“userstatistics”应用应该从“users”应用导入模型,但“users”应用不应该依赖“userstatistics”。

如果您的应用从 3rd 方应用程序(比如说 django-piston)导入模型,请务必在需求文件中指定。

【讨论】:

【参考方案2】:

如果您正在构建一个不可能向公众发布的内部应用程序,那么当然可以随心所欲。

如果您要构建的内部应用几乎没有机会向公众发布,但可能会被未来/当前的开发人员使用,当然可以,但请务必记录应用正常运行所需的内容。

如果您正在构建一个公开发布的应用程序,请尽量保持它的独立性(并且依赖于 django-internals,即尽可能使用 django 提供的功能)。如果您确实需要第三方应用程序才能工作,或者第三方应用程序会使您的代码更易于管理,那么请确保包含依赖项,但请务必记录所有要求和必要的设置。

在大多数情况下,只要您有足够的文档,您几乎可以做任何您想做的事情。

但是,我不得不质疑制作自己的 User 模型与 django 的内置 auth.User 同名的理智。

【讨论】:

不只是同名,是完全相同的模型类。 用户和用户统计应用程序只是为了举例,因为我的情况不是那么容易理解。这回答了我的问题,谢谢!【参考方案3】:

你可以尝试更好extending the Django User model with inheritance。您将使用添加了自定义字段的 django 用户,因此所有应用程序都将拥有相同的用户。

【讨论】:

过去我在 IRC (freenode#django) 上见过几个人在尝试继承 auth.User 时遇到了一个又一个问题。一般来说,这是你应该远离的事情之一,除非你知道你需要它。顺便说一句,user profiles 是存储有关用户的其他信息的普遍首选方法。【参考方案4】:

您可以直接在 app2/models.py 中导入模型。通常你可能需要一个外键,看起来像

models.ForeignKey('app1.ModelClass1', on_delete=models.CASCADE, related_name='modelclass2')

【讨论】:

【参考方案5】:

不要这样做。它们将具有相同的应用程序名称,并且 ORM 将被混淆。改用抽象模型,并且两者都派生自它。

【讨论】:

你没有误解OP在问什么吗?他没有说在不同的应用程序中定义相同的模型,他是在谈论将 User 类导入他的应用程序,这样他就可以从中获取数据,确定吗? IOW,这个问题的答案是“是的,你当然可以。” @Daniel:有可能是这种情况。如果 OP 澄清了他在寻找什么,那么我会修改。 你应该考虑修改它,因为你的解释显然是错误的

以上是关于在 Django 应用程序之间共享模型的主要内容,如果未能解决你的问题,请参考以下文章

Django在多个项目之间共享相同用户模型和数据库的最佳方式

Django 相关模型无法解析

如何在两个 django 应用程序之间共享会话?

使用数据库路由器在应用程序 Django 之间共享(mysql)数据库

Django -- Python -- 如何在一个项目中的所有应用程序之间共享一个全局模板标签

Tornado websockets:在进程之间共享打开的 web sockets