Django 2 从一个模型到另一个模型的外键
有没有办法让一个模型里有两个外键指向同一个模型?举个例子,我想让“日期”和“主管”这两个字段在时间表(Timesheet)中都作为外键指向日期时间表(DateTimesheet)。我想要实现的是在后台管理中,把时间表和日期时间表放在一起,这样我只需要输入一次日期和主管的信息,然后就可以在下面输入多个时间表,而不需要为每个时间表都重新输入日期和主管。
class DateTimesheet(models.Model):
date = models.DateField()
supervisor = models.ForeignKey(User)
class Meta:
verbose_name = 'Daily Timesheet'
unique_together = (('date', 'supervisor'),)
def __unicode__(self):
return '%s | %s' % self.date.strftime("%A, %B %d.")
class Timesheet(models.Model):
date = models.ForeignKey(DateTimesheet)
supervisor = models.ForeignKey(DateTimesheet)
job = models.ForeignKey(Job)
phase = models.ForeignKey(Phase)
equip = models.ForeignKey(Equipment, null=True, blank=True)
employee = models.ForeignKey(Employee)
local = models.ForeignKey(Local)
pay_class = models.ForeignKey(PayClass)
reg = models.IntegerField(max_length=1)
ot = models.IntegerField(max_length=2, null=True, blank=True)
bill_rate = models.DecimalField(decimal_places=2,max_digits=6, blank=True,null=True)
bill_hours = models.IntegerField(max_length=2,blank=True,null=True,)
3 个回答
0
没问题。
你应该会看到一个错误提示,告诉你需要指定一个 related_name
,这个信息可以帮助你解决问题。
你必须指定 models.ForeignKey(DateTimeSheet, related_name="something_else")
,否则 Django 会抱怨说反向关系的管理器需要唯一的名称。
简单来说,related_name
是你在反向查找时使用的,比如:datetimesheet.timesheet_set.all()
。
当你有两个外键指向 DateTimesheet
时,Django 需要能够区分这两个外键。
3
没错。给它们不同的 related_name
值。
8
如果你在一个模型上有两个外键指向同一个模型,你需要在相应的内联管理界面上设置 fk_name
:
class DateInline(admin.TabularInline):
model = DateTimeSheet
fk_name = "date"