2010-02-08 76 views
2

我是新来的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(('Feature', 'Protein', 'Substrate')) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string 'self'

你能帮助我的语法吗?

回答

1

看一看many-to-one-relationshipsForeignKey

我想你对ForeignKey正在做什么有错误的想法。但是,如果没有解释你想达到什么,这很难提供帮助。

从你的代码,我会假设你想要AccessionID保存'Feature', 'Protein', 'Substrate'值之一。但是,当您将其标记为primary_key时,这意味着您的表中最多只有三行,因为主键是唯一的。

更新:

阅读其他意见后,是的,你可能不得不使用Generic Relations。您不能像您尝试的那样将一个ForeignKey指向不同的表。

2

什么语法?你还没有解释你试图用这个来完成什么。该代码仅向我们展示了您所尝试的内容,如您所知,它不起作用。这应该做什么?看起来你可能想要特征,蛋白质和底物模型之间的多对多关系。 (你是否也有这些型号?不清楚)

如果是这样,你将需要为每个关系创建一个单独的外键,让django创建自己的主键,然后定义一个对你的约束unique together外键。您的表格将会有一个额外的列来表示主键,但是您只需接受使用django即可,因为它不支持多列主键。

编辑:您的评论后,它看起来像你在找什么是generic foreign key。这是使用一种关系链接到多个其他表格的最佳方式。

+0

对不起......我会尽量解释一点。我确实有所有需要的模型。 AccessionID可以是特征和/或蛋白质和/或底物的外键。这更清楚吗? 谢谢! – user268746

+0

编辑添加到我的答案解决您的说明。 – jcdyer

+0

+1通用外键是你正在寻找的 – DrBloodmoney

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')