2013-05-22 76 views
1

我在Django网站上关注了一些示例,我理解Django希望您将项目的各个部分分解为“应用程序”的想法。了解如何创建django模型

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

在这种情况下,我将有一个“应用” 包含models.py,有两个模型类:BookAuthorBook课程将作为其领域之一author = models.ForeignKey(Author)

因此,这里是我的问题:

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

如果以下答案之一已完全解答您的问题,请继续并接受它。否则,让我们知道我们可以做些什么来澄清。 – Jacinda

+0

我喜欢这两个答案! – 40Plot

+0

哈哈 - 这意味着系统正在工作。欢迎来到SO! – Jacinda

回答

1

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

说这是在一个名为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将管理在其他人之后采取的操作。不过,这只是我的想法。

1
  1. 是的。看到这个问题:Foreign key from one app into another in Django
  2. 您可以使用Django的内置身份验证应用程序和用户对象。这是“包含电池”功能之一。请参阅herehere
  3. 我不是 有很多MySQL的经验,但你提到的一些 内置到ORM中。即如果您未指定 不同的主键(AutoField reference),自动增量 会自动使用默认ID字段。从Django 1.5开始添加了Non-unique indices。触发器似乎有点棘手,但this blog post看起来像一个很好的写作。

另外,Django aggregation topic guide使用作者和书籍模型作为主要的例子。

+0

正如第1项子弹的附注 - Django所吹嘘的特性之一是“可插拔应用程序”。基本上什么 这意味着我应该能够把你的'书籍'应用程序和 插入到我自己的'库'应用程序,它应该直接工作 框。如果你有一个应用参考了其他应用,那么你已经 成功地将'Books'应用耦合到这个其他应用,并且你没有办法将它们解耦。这是使用Django制作更大系统时的缺点之一,如果你想称之为“业务逻辑层”,那么就没有 。 –

+0

@limelights你是完全正确的,但我不认为这两个(可插入的应用程序与相互依赖关系)是相互排斥的。在大型公司项目中,可能有一些相互依赖的应用程序从未打算公开发布给公众,但如果分裂(为了避免具有数千行models.py文件)而在逻辑上更清楚。应该尽一切努力让事情可重用,但如果整个项目在逻辑划分上更容易维护,我认为这是值得的。通常你可以看到一个应用程序是否适合重复使用,同时编写和设计。 – Jacinda

+0

一个更好的例子,你想要一个外键到另一个应用程序(与作者和书籍),将是一个指向Django auth用户的外键,它被广泛使用。例如。 'appointment_holder = models.ForeignKey(settings.AUTH_USER_MODEL)' – Jacinda