如何从同一个 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 文档了解更多信息。
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 文档了解更多信息。