Django 继承模型中带有ForeignKey的ModelForm

Django 继承模型中带有ForeignKey的ModelForm,django,foreign-keys,django-forms,Django,Foreign Keys,Django Forms,模型: class Human(models.Model): UNIQUE = models.CharField(max_length=10) name = models.CharField(max_length=30) father = models.ForeignKey('Human', null=True, blank=True) mother = models.ForeignKey('Human', null=True, blank=True) class Person

模型:

class Human(models.Model):
  UNIQUE = models.CharField(max_length=10)
  name = models.CharField(max_length=30)
  father = models.ForeignKey('Human', null=True, blank=True)
  mother = models.ForeignKey('Human', null=True, blank=True)

class Person(Human):
  email = models.EmailField()
现在,我正在尝试制作ModelForm:

class PersonForm(ModelForm):
  class Meta:
    model = Person
    fields = ('UNIQUE','name','email')
直到这个-完美的工作

现在我想添加两个字段:父亲和母亲

若此人已有父亲(和/或母亲)-只需显示姓名即可。如果没有-显示字段(或两个字段),用户必须在其中键入UNIQUE

我只添加字段:我尝试将父/母添加到类元字段中:

class PersonForm(ModelForm):
  class Meta:
    model = Person
    fields = ('UNIQUE','name', 'email', 'father', 'mother')
错误显示:

Exception Type: AttributeError 
Exception Value: 'Person' object has no attribute 'father_id'
这是不正确的,因为它有这个属性(从人类继承的)…有什么提示吗

大多数解决方案都指向choiceview,但我不想显示可能性——只要输入UNIQUE,如果是在base-show中,如果不是,则什么都不做

已编辑

因为讨论的方向是错误的-模型人和模型人肯定很好-在管理中一切正常-但我创建了输入数据的界面(我不想从其他可能的选项中选择父亲/母亲,如在管理模块中)

edited2 非常重要的修改:

  father = models.ForeignKey('Human', related_name="father", null=True, blank=True)
  mother = models.ForeignKey('Human', related_name="mother", null=True, blank=True)

这个错误消失了,在表格中出现了母亲/父亲的id-很快就可以将其更改为唯一的

,以避免在评论中进行长时间的讨论,我在这里给出了一个可能的答案。 数据库中是否有
person
human
两个表? 类
Person
继承自
Human
,从而继承了递归关系。如果表
human
不在数据库中,则类
Person
建立关系的所有尝试都是徒劳的

编辑:

因此,让我们总结一下,因为似乎是相关的名称导致了这个问题。 当从一个模型到另一个模型(或作为递归关系到模型本身)创建多个外键时,需要指定不同的相关名称。如果未指定,Django将尝试通过在模型名称后附加
\u set
来创建相关名称。 在您的例子中,它类似于
person.human\u set.all()
person
是类
person
的实例)。在这里,父亲和母亲无法区分。 还可以通过将相关名称声明为
+
来禁用反向关系:
related_name='+'

问题出在与字段名相同的related_name中-这会导致错误

这是正确的答案: 父亲=models.ForeignKey('Human',related_name=“父亲子女”,null=True,blank=True)
母亲=models.ForeignKey('Human',related_name=“mothers\u children”,null=True,blank=True)

父亲=models.ForeignKey,null=True,blank=True)
-非常奇怪的一行。是准确的代码吗?对不起,我的错误-当然不是…你为什么在
ModelForm
中使用
model=Person
,而不是
model=Human
?错误准确地告诉,发生了什么:人物模型没有父字段这不是真正的代码,并且充满了错误。你能发布真实的代码吗?这个人也没有名字和唯一性是的,当然两者都在数据库中。此人有电子邮件和人名id,这是指向人名id的指针。
人名id
来自哪里?错误消息表示
Person
没有属性
father\u id
。Django追加
\u id
以查找相关模型的主键。表
human
必须具有类似主键的内容。数据库中此列的名称是什么?django本身创建数据库。我不修改数据库中的任何内容。人类的主键当然是id。我试图复制你的案例,但到目前为止我无法复制错误。如我所见,
human_ptr
human_ptr_id
是自动创建的。还将创建属性
父亲id
母亲id
。但是,您是如何实现模型同步的呢。我得到错误是因为
Human
尚未创建,因为
Person
首先声明。由于相关名称的原因,还存在一个错误。同一个模型有两个外键会导致与相关名称冲突,因此您应该显式指定它们。您使用哪个版本的Django?