我是Django的新手,我在模型中有以下关系
class Name_Mapping(models.Model):
AccessionID = models.ForeignKey(('Feature', 'Protein', 'Substrate'), primary_key = True)
Element_Name = models.CharField(max_length = 40)
这会引发错误:
AssertionError:ForeignKey(('Feature','Protein','Substrate'))无效。 ForeignKey的第一个参数必须是模型,模型名称或字符串'self'
你能帮我解释一下这个语法吗?
答案 0 :(得分:2)
什么语法?你没有解释你想要用这个来完成什么。代码只显示您尝试过的内容,如您所知,它不起作用。这该怎么办?看起来您可能希望Feature,Protein和Substrate模型之间存在多对多的关系。 (你也有这些型号吗?目前尚不清楚。)
如果是这样,您需要为每个关系创建一个单独的外键,让django创建自己的主键,然后在外键上定义unique together约束。你的表将有一个额外的列来表示主键,但是你只需要接受使用django,因为它还不允许使用多列主键。
编辑:发表评论后,您看到的内容似乎是generic foreign key。这是使用一个关系链接到多个其他表的最佳方式。
答案 1 :(得分:1)
查看many-to-one-relationships和ForeignKey。
我认为你对ForeignKey
正在做什么有错误的想法。但是,如果没有解释你想要实现的目标,就很难提供帮助。
从您的代码中我假设您希望AccessionID
保留其中一个值'Feature', 'Protein', 'Substrate'
。但是当您将其标记为primary_key
时,表示您的表格中最多有三行,因为主键是唯一的。
<强>更新强>
阅读其他评论后,您可能需要使用Generic Relations。你不能让一个ForeignKey像你试过的那样指向不同的表。
答案 2 :(得分:1)
我同意jcd。您可能需要使用generic foreign key。
由于您询问的是语法,因此您可能希望更改类和变量命名约定,以便与大多数Python代码中的样式相匹配。有关详细信息,请参阅PEP8,但两个重要项目是使用CapWords用于类名和小写(为了提高可读性而不使用下划线)。
这是一个可能的重写NameMapping模型,它使用通用外键和更多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')