【问题标题】:Django and models with different table namesDjango和具有不同表名的模型
【发布时间】:2020-02-08 20:28:17
【问题描述】:

目前我正处于为锦标赛表创建新应用程序的设计阶段。目标是提供一个应用程序,可以在后端输入各种联赛的比赛结果,并在前端查看决赛桌。作为数据库,我想使用 PostgreSQL,因为它提供了区分不同联赛的模式。当前架构(很可能)如下所示:

= schema ==== tablename ==============
- public  ___ teams
- league1 ___ league1_<season>_results
           |_ league1_<season>_tables
- league2 ___ league2_<season>_results
           |_ league2_<season>_tables
- league3 ___ league3_<season>_results
           |_ league3_<season>_tables

<season> ... 2019, 2020, ...

以及leagueX_results as LeagueX_tables 将具有相同的模型,这意味着league 1 中的_results 与league2 中的_results 具有相同的布局,league1 中的_tables 与league2 中的模型相同。 p>

_tables 是(重新)创建的,使用 Pandas 作为中间人来计算表格(这部分已经在工作并且在抽屉中)。我仍在寻找的唯一事情是更改表名(动态)以在同一模型中使用的可能性。

不幸的是,我(还)不熟悉 Django 框架,我之前使用过 Flask 和 SQLAlchemy。对于这种组合,我可能对如何解决这个问题有一些想法,但是对于这个项目,我正在考虑使用 Django 作为框架,而不是将松散的末端连接在一起,因为某些部分(权限,...)的完整性要好得多,而且看起来更全面。

所以,我想问问社区是否有人遇到过类似的挑战,以及如何解决的。

提前非常感谢,问候,托马斯

【问题讨论】:

  • 请回复此查询:django 是否会参与创建表,或者 django 将仅使用 pandas 创建的表(即 django 不会创建这些表,而是使用现有的表)?
  • _result 表的创建将通过后端完成,即准备下一个赛季。 _tables 表是通过 Pandas 创建的,因为它的接口只支持追加或重新创建,但不支持更新。

标签: python django django-models


【解决方案1】:

为了满足您的目的(我认为您在 pandas 和 django 创建的两个表中都有相似的字段),首先创建一个抽象模型,然后在两个单独的模型中继承模型 - 一个托管和一个非托管。 Django ORM 将负责托管模型的表创建和管理,pandas 将负责非托管模型。如果您允许,Django 仍然可以访问和操作非托管模型的记录(默认情况下是允许的)。以下是一个很好的例子 -

class MyAbstractBaseModel(models.Model):
    field1 = models.CharField(max_length=20)

    class Meta:
        abstract = True


class MyDjangoModel(MyAbstractBaseModel):
    class Meta:
        db_table = "mymodel_result"


class MyPandasModel(MyAbstractBaseModel):
    class Meta:
        db_table = "mymodel_table"
        managed = False

如果您对表格有单独的定义,那么只需将您的 pandas 模型定义为您的要求,并在元选项中设置 managed = False。另外不要忘记在您的实际表名中明确提及 db_table 选项(对于 django 和 pandas 模型)。有关模型元选项的更多信息,请参阅文档页面 -

https://docs.djangoproject.com/en/3.0/ref/models/options/

如果您的表位于不同的数据库中,也请考虑以下 - https://docs.djangoproject.com/en/3.0/topics/db/multi-db/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2021-10-31
    • 2019-03-26
    • 2015-11-28
    相关资源
    最近更新 更多