【问题标题】:Can I Make a foreignKey to same model in django?我可以在 django 中为同一模型制作外键吗?
【发布时间】:2012-06-28 04:11:40
【问题描述】:

假设我有这个模型:

class Task(models.Model):
    title = models.CharField()

现在我希望一项任务可能与另一项任务相关。所以我想这样做:

class Task(models.Model):
    title = models.CharField()
    relates_to = ForeignKey(Task)

但是我有一个错误,指出任务是注释定义的。 这是否“合法”,如果不是,我应该如何做类似的事情?

【问题讨论】:

标签: django django-models


【解决方案1】:

是的,您可以这样做,将 ForeignKey 属性设为字符串:

class Task(models.Model):
    title = models.CharField()
    relates_to = ForeignKey(to='Task')

您还可以通过使用点符号来交叉引用应用的模型,例如

class Task(models.Model):
    title = models.CharField()
    relates_to = ForeignKey(to='<app_name>.Task')  # e.g. 'auth.User'

【讨论】:

  • 我认为这个语法已经改为“models.ForeignKey('self', on_delete=models.CASCADE)”
  • @Brendan,我不认为它有,尽管最好的做法可能是明确副作用。
【解决方案2】:
class Task(models.Model):
    title = models.CharField()
    relates_to = models.ForeignKey('self')

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

【讨论】:

  • 使用self 代替“任务”是个好主意!
  • 假设我使用这样的东西并想删除任务。由于每个 Task 实例都有一个指向另一个 Task 实例的外键,如果我删除一个 Task 实例,Django 会自动级联删除,因此它会自动删除指向我刚刚删除的 Task 的任何 Task 实例?换句话说,CASCADE DELETE 在同一个模型中仍然有效吗?
  • @Marc 我还没有具体确认,但这将是我所期望的行为。使用 Django,我更担心的是必须特别防止级联删除,而不是确保它发生。
猜你喜欢
  • 2011-09-30
  • 1970-01-01
  • 2018-07-14
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多