Django外键

时间:2010-02-08 15:22:51

标签: 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'))无效。 ForeignKey的第一个参数必须是模型,模型名称或字符串'self'

你能帮我解释一下这个语法吗?

3 个答案:

答案 0 :(得分:2)

什么语法?你没有解释你想要用这个来完成什么。代码只显示您尝试过的内容,如您所知,它不起作用。这该怎么办?看起来您可能希望Feature,Protein和Substrate模型之间存在多对多的关系。 (你也有这些型号吗?目前尚不清楚。)

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

编辑:发表评论后,您看到的内容似乎是generic foreign key。这是使用一个关系链接到多个其他表的最佳方式。

答案 1 :(得分:1)

查看many-to-one-relationshipsForeignKey

我认为你对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')