【问题标题】:How to use models between multiple apps?如何在多个应用程序之间使用模型?
【发布时间】:2016-08-21 03:26:20
【问题描述】:

我正在构建一个 Django 应用程序,我被要求拆分 models.py 并将生成的模型放在“模型”文件夹中。我这样做了,效果很好。 然后我被要求将模型文件夹移动到项目级别,以便其他应用程序可以使用这些模型。 文件结构如下所示(取自 Django 教程):

mysite
   mysite
   polls
   db.sqlite3
   manage.py
   models <- Have the poll app's models in there?

但是,我所读到的所有内容都表明,这很不受欢迎,模型应该存在于应用程序级别,而不是项目级别。

那么,处理这个问题的最佳方法是 Django——让模型被多个应用程序使用?我读过的一些内容建议在应用程序之间导入模型或更改模型 Meta 类 db_table 选项。

不过,我发现的大多数帖子都是 5 年前的,所以我不确定目前最好的方法是什么。

如果我将模型导入新应用程序,然后 / 对它们执行某些操作,它们是否指向与导入它们的应用程序相同的数据库,或者是否为新应用程序创建了新数据库?

感谢您的帮助。非常感激。

【问题讨论】:

  • 应该是 polls/models/xxx.py
  • 您可以在关系字段中使用'appname.model_name' 将模型从一个应用程序引用到另一个应用程序。

标签: django python-2.7 django-models


【解决方案1】:

这是一个很好的问题,当你开始在 Django 中编程时,他们告诉你(Django 项目团队)应用程序就像一个模块,但他们没有告诉你如何去做。

您可以按照 Rohan 在对您的问题的评论中所说的那样进行操作:“您可以在关系字段中使用 'appname.model_name' 将模型从一个应用程序引用到另一个应用程序。”,但您必须牢记Django 中的应用程序被认为可以使这些模块可重用,据此,最好的选择是将您的应用程序定向到服务或其他允许您解耦项目应用程序的架构,将 rest 框架视为一个选项

【讨论】:

    【解决方案2】:

    我也在想同样的事情,看到你从 reddit 得到了一个不错的答案,但我想我会投入 2 美分。

    您可以将模型重构为单独的应用程序。


    tl;博士

    关于你的情况的一些假设

    1. 起初,模型从 models.py 中拆分成单独的 python 文件以提高可维护性
    2. 模型已上移至项目级别,以尽量减少应用程序更改对模型的影响(反之亦然)

    举个例子:

    mysite
    ├── polls
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models
    │   │   └── __init__.py
    │   │   └── foo.py
    │   │   └── bar.py
    │   ├── tests.py
    │   └── views.py
    ├── db.sqlite3
    ├── manage.py
    └── mysite
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py
    

    出于某种逻辑原因,我们有 2 个模型(foo 和 bar)分开。

    恕我直言,我认为将 foo 和 bar 模型放在他们自己的应用程序中可以使整体可维护性受益如果它们满足 2 个标准

    1. 它们完全不同
    2. 它们被多个应用程序使用

    此时,您站点中的其他应用可以像以前一样导入模型,但布局看起来更像 Django 最佳实践

    新布局:

    mysite
    ├── polls
    ├── foo
    │   └── models.py
    │   └── etc...
    ├── bar
    │   └── models.py
    │   └── etc...
    ├── etc...
    

    【讨论】:

      猜你喜欢
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2011-11-18
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多