Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django型号相同类型的外键_Django_Django Models - Fatal编程技术网

Django型号相同类型的外键

Django型号相同类型的外键,django,django-models,Django,Django Models,我试图构建一个非常通用的模型,它需要嵌套的灵活性。下面是一个简单的例子 Work Symphony No.1 |_Work |_Movement 1 | |_Work | |_Allegro | |_Work | |_Largo |

我试图构建一个非常通用的模型,它需要嵌套的灵活性。下面是一个简单的例子

Work                        Symphony No.1
  |_Work                              |_Movement 1
  |  |_Work                           |  |_Allegro
  |  |_Work                           |  |_Largo
  |                                   |
  |_Work                              |_Movement 2
     |_Work                              |_Poco Allegretto
我希望我能做的是抛出一个语法错误,因为工作显然还没有定义,它不能是外键

class Work(models.Model):
    work_name = models.CharField('Work Name', max_length=100)
    work_parent = models.ForeignKey(Work)
我在考虑使用这样的基类:

class BaseWork(models.Model):
    pass

class Work(BaseWork):
    name = models.CharField(max_length=100)
    work_parent = models.ForeignKey(BaseWork)
我相信这样做,可以说我可以让弗莱成为他自己的祖父,但有没有一种“正确”的方法呢

谢谢@Seether

class Work(BaseWork):
    name = models.CharField(max_length=100)
    work_parent = models.ForeignKey('self', null=True)

我很好奇这是否以及为什么会是一种不好的做法。肯定有很多模型需要嵌套,对吗?他们对结构进行硬编码了吗?

关于work\u parent=models.ForeignKey('self')呢?除此之外,我想问问自己,你到底想要实现什么,因为在这种设计中,你可能需要在其他地方实现一些其他的数据控制机制,因为模型本身并不能帮助你阻止Fry成为他自己的祖父。“self”似乎起作用了,谢谢。严格地说这段代码,我看不出有什么不好的做法。我之前告诉过你的是问问你自己,你需要筑巢做什么。还请记住,这并不完全是您在这里进行的嵌套,更可能是一系列条目(null=True)引用了其他条目:(pk(1)->pk(5),pk(2)->null,pk(5)->pk(1)…)。可以创建循环引用,但不一定。如果您讨论的是模型中的子类化,那么这肯定不是一个坏的做法,而且是愚蠢的想法。当你定义一个新的模型时,只需考虑子类<代码>模型。