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?