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

How can I add 2 foreign keys from the same table? is it possible?

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'

我到底做错了什么?

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

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

关于您问题的答案:。您可以将多个外键添加到连接到相同 table 的模型中。您必须考虑的唯一一件事是给它们不同的 related_name 值,就像您所做的那样。

至于你得到的错误;您在 peaople 模型中创建了一个名为 comp_name 的 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 文档了解更多信息。