【问题标题】:Understanding how to create django Models了解如何创建 django 模型
【发布时间】:2013-05-16 23:44:57
【问题描述】:

我遵循了 Django 网站上的一些示例,我理解 Django 希望您将项目的各个部分分成“应用程序”的想法。

每个“应用”都有自己的模型。因此,如果我想创建一个允许用户登录和修改某些数据(添加/编辑/删除)的应用程序,例如书籍集合和作者集合,我需要为此创建应用程序。

在这种情况下,我会有一个“应用”书籍 包含models.py,具有两个模型类:BookAuthorBook 类将具有 author = models.ForeignKey(Author) 作为其字段之一。

所以这是我的问题:

  1. 如果我创建一个新的app,我在该应用程序中的模型是否可以包含指向不在同一个app 中的模型的 ForeignKey 字段?
  2. 正如我所提到的,我想要一个允许用户登录的凭据“表”。这怎么可能实现?是否有必要使用用户模型启动一个新的“应用程序”,例如“用户”?
  3. 如何将“自动增量”、“非唯一索引”和“触发器”等 MySQL 功能整合到这些模型中,还是必须手动或通过 MySQL 控制台/管理器完成?

【问题讨论】:

  • 如果以下答案之一已完全回答您的问题,请继续接受。否则,请告诉我们我们可以做些什么来澄清。
  • 哈哈 - 这意味着系统正在运行。欢迎来到 SO!

标签: django model


【解决方案1】:
  1. 是的。看到这个问题:Foreign key from one app into another in Django
  2. 您可以为此使用 Django 的内置身份验证应用程序和用户对象。这是“包含电池”功能之一。请参阅 herehere
  3. 我没有 特别是对 MySQL 有同样丰富的经验,但其中一些 你提到的东西都内置在 ORM 中。 IE。自动递增 如果您没有指定 不同的主键 (AutoField reference)。 Non-unique indices 从 Django 1.5 开始添加。触发器似乎有点棘手,但 this blog post 看起来不错。

顺便说一句,Django aggregation topic guide 使用 Author 和 Book 模型作为主要示例。

【讨论】:

  • 就像第 1 条的旁注一样 - Django 拥有的功能之一是“可插入的应用程序”。基本上,这意味着我应该能够将您的Books 应用程序插入我自己的Library 应用程序,它应该可以直接使用。如果您的应用程序引用了其他应用程序,那么您已经成功地将Books 应用程序耦合到该其他应用程序,并且您无法将它们解耦。这是使用 Django 构建更大系统时的缺点之一,如果您想这样称呼它,则没有明显的“业务逻辑层”。
  • @limelights 你是完全正确的,但我不认为这两者(可插拔应用程序与相互依赖)是相互排斥的。在大型公司项目中,可能会有一些相互依赖的应用程序永远不会向公众发布,但如果拆分它们在逻辑上会更清晰(以避免拥有数千行的 models.py 文件)。应该尽一切努力保持事物的可重用性,但如果整个项目通过逻辑划分更易于维护,我认为这是值得的。通常,您可以在编写应用程序并相应地进行设计时了解其是否具有可重用性。
  • 另一个应用程序的外键(相对于作者和书籍)的更好示例是指向 Django auth 用户的外键,该用户被广泛使用。例如。 appointment_holder = models.ForeignKey(settings.AUTH_USER_MODEL)
  • 我同意你的观点,有时你需要它。但是将自己附加到 django.contrib 模型会更好,因为所有 Django 安装都带有 Django 用户模型。
【解决方案2】:

没有什么能阻止您与其他应用中的模型建立关系。应用程序只是在逻辑位置对代码进行分组的一种方式。下面是一个示例,说明如何引用位于不同应用程序中的一个模型。

假设这是在一个名为myapp的模块中,您可以在其他应用程序中引用其他模型,语法类似于以下。在此示例中,“auth”应用程序内部存在一个用户模型。

class MyModel(models.Model):
    ....
    user = models.ForeignKey('auth.User')

另见:https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey

Django 内置了一个强大而灵活的用户系统。当您开始一个新项目时,默认情况下,它将创建一个用户表,可用于创建、管理和验证用户。

这里有一些相关的information。 (实际上,上面的示例显示了与内置用户表的关系。)您不必启动新应用程序来定义用户,除非您想自定义用户框架的默认行为。

Django 自动增加主键字段记录。它为此创建了必要的数据库对象。如果需要,它还会强制执行唯一字段,并允许进行大量其他自定义。据我所知,Django 不支持数据库触发器。我相信触发事物的“Pythonic”方式可能是在您的代码中这样做。具体来说,Django/Python 将管理在其他人之后采取的行动。不过,这只是我的想法。

【讨论】:

    猜你喜欢
    • 2015-01-14
    • 2016-11-04
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2018-12-29
    • 1970-01-01
    • 2021-05-27
    相关资源
    最近更新 更多