如何从同一个表中添加2个外键?可能吗?

时间:2015-04-11 16:08:39

标签: django django-models

Django文档说我应该能够像下面那样做到这一点:

class comp_name(models.Model):

  competition_type = models.ForeignKey(comptype, verbose_name='Level')
  competition_name = models.CharField(verbose_name='Division',max_length = 60)
  comp_style = models.CharField(verbose_name='HT/SC', max_length = 20)

  def __unicode__(self):
    return str(self.competition_type) + " " + self.competition_name + " "+ self.comp_style

class peaople(models.Model):
  comp_name = models.ForeignKey(comp_name, blank=True,    related_name="competition_name" ,verbose_name='Division')
  heat_num = models.ForeignKey(comp_name,blank=True, related_name="heat_number")

但是这样做会给我带来这个错误:

in __init__
    assert isinstance(to, six.string_types), "%s(%r) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string %r" % (self.__class__.__name__, to, RECURSIVE_RELATIONSHIP_CONSTANT)
AssertionError: ForeignKey(<django.db.models.fields.related.ForeignKey>) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string 'self'

我到底错在了什么?

我正在尝试从同一个模型中添加两​​个外键

2 个答案:

答案 0 :(得分:1)

至于你的问题的答案:。您可以向模型添加多个连接到同一个表的外键。只有你必须考虑的是给他们不同的related_name值,就像你一样。

至于你得到的错误;您在comp_name模型中创建了一个名为peaople的ForeignKey字段,该字段实际上影响了上面定义的另一个名为comp_name的模型。您应该将字段的名称更改为其他名称,然后您的问题将得到解决。

注意:假设comptype是定义竞争类型的另一个模型。

class Competition(models.Model):
    competition_type = models.ForeignKey(CompetitionType, verbose_name='Level')
    name = models.CharField(verbose_name='Division',max_length=60)
    style = models.CharField(verbose_name='HT/SC', max_length=20)

    def __unicode__(self):
        return "{} {} {}".format(self.competition_type, self.name, self.style)

class Competitor(models.Model):
    competition_name = models.ForeignKey(Competition, blank=True, related_name="competition_name" ,verbose_name='Division')
    heat_num = models.ForeignKey(Competition, blank=True, related_name="heat_number")

我建议您遵循正确的命名约定。有关详细信息,请参阅PEP8文档。

答案 1 :(得分:-2)

外键不应为空。删除blank = True