Django外键

Django外键,django,Django,我是Django的新手,我在模型中有以下关系 class Name_Mapping(models.Model): AccessionID = models.ForeignKey(('Feature', 'Protein', 'Substrate'), primary_key = True) Element_Name = models.CharField(max_length = 40) 这会引发一个错误: AssertionError:ForeignKey((“功能”、“蛋白质”、“底物”

我是Django的新手,我在模型中有以下关系

class Name_Mapping(models.Model):
 AccessionID = models.ForeignKey(('Feature', 'Protein', 'Substrate'), primary_key = True)
 Element_Name = models.CharField(max_length = 40)
这会引发一个错误:

AssertionError:ForeignKey((“功能”、“蛋白质”、“底物”)无效。ForeignKey的第一个参数必须是模型、模型名称或字符串“self”

你能帮我学习一下语法吗?

看一看,然后

我想你对ForeignKey的所作所为有一个错误的想法。但是如果不解释你想要实现什么,就很难帮助你

从您的代码中,我假设您希望
AccessionID
包含一个值
'Feature','Protein','substand'
。但是,当您将其标记为
主键时,这意味着您的表中最多有三行,因为主键是唯一的

更新:


在阅读了其他评论之后,是的,你可能不得不使用。您不能让一个ForeignKey像您尝试的那样指向不同的表。

什么语法?你还没有解释你想用这个完成什么。代码只显示了您尝试的内容,正如您所知,它不起作用。这是怎么回事?看起来您可能想要特征、蛋白质和底物模型之间的多对多类型关系。(你们也有这些型号吗?不清楚。)

如果是这样,您将需要为每个关系创建一个单独的外键,让django创建自己的主键,然后在外键上定义一个约束。您的表将有一个额外的列来表示主键,但您必须接受使用django,因为它还不允许有多个列主键


编辑:在你的评论之后,看起来你正在寻找的是一个。这是使用一个关系链接到多个其他表的最佳方式。

我同意jcd。你可能需要使用一种新的方法

由于您在询问语法,您可能希望更改类和变量命名约定,以与大多数Python代码中的样式相匹配。有关更多详细信息,请参见,但有两大项是对类名使用大写字母,对变量使用小写字母(为了可读性,不使用下划线)

下面是一个可能使用通用外键和更具PEP8命名约定的重写名称映射模型:

from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class NameMapping(models.Model):
    name = models.CharField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    accession_object = generic.GenericForeignKey('content_type', 'object_id')

很抱歉我会再解释一点。我有所有需要的型号。AccessionID可以是特征和/或蛋白质和/或底物的外键。这更清楚吗?谢谢编辑添加到我的答案中,以解决您的澄清。