【问题标题】:How should I build this Django model to do what I want我应该如何构建这个 Django 模型来做我想做的事
【发布时间】:2010-12-27 18:28:38
【问题描述】:

这是我以前的(但意识到你显然不能按这个顺序做:

class MasterAdmin(models.Model):
    """
    A permanent admin (one per Account) that shouldn't be deleted.
    """
    admin = models.OneToOneField(AccountAdmin)

class Account(models.Model):
    """
    A top-level account in the system.
    """
    masteradmin = models.OneToOneField(MasterAdmin)


class AccountAdmin(models.Model):
    """
    An Account admin that can be deleted.  This includes limited permissions.
    """
    account = models.ForeignKey(Account)

我想你可以从这个例子中看出我想要做什么。我想要一个 MasterAccountAdmin,它共享来自 AccountAdmin 的属性。目的是我想让人们能够删除 AccountAdmin,而不是 MasterAccountAdmin。我不想只在 AccountAdmin 上有一个名为“master = models.BooleanField()”的属性。

显然,这个示例不起作用,因为 MasterAdmin 在创建之前引用了 AccountAdmin,但我想展示我想要实现的目标。我是不是想错了?

【问题讨论】:

  • -1:问题标题很差。你能把标题改成你真正的问题吗?也许是“我如何用循环引用定义三个模型”或描述问题的内容。
  • 如果您在只关注代码之前阅读了问题,这是一个不错的标题。我不是在问如何在技术上实现我的代码状态。我在问什么是编写模型的好方法(相对于我的方法)以实现我想要实现的高级目标。

标签: python django django-models foreign-keys one-to-one


【解决方案1】:

为什么不直接将 is_master 设为 AccountAdmin 的属性,然后重写 delete() 方法以确保 is_master 不为真?

【讨论】:

  • 这是比 OP 正在做的更好的方法,但我想回答他与前向引用有关的问题。
  • 哦,好点。我忙于架构,没有看到问题(这也是我第一次在 Django 工作时遇到的问题)。
【解决方案2】:

当您有前向引用时,请使用引号。

admin = models.OneToOneField('AccountAdmin')

See the docs.

如果需要在尚未定义的模型上创建关系,可以使用模型的名称,而不是模型对象本身...

【讨论】:

  • 谢谢!顺便说一句,这是非常 Pythonic 的吗(这在引号中)?
  • 这是 django 的一个特殊功能,可以容纳这种关系。这是完全可以接受的做法,但 python 并不明确支持。
  • jcd 说了什么。我更新了我的答案以获得文档的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 2014-05-14
  • 2011-02-27
  • 2014-07-23
  • 1970-01-01
相关资源
最近更新 更多