Django 2 从一个模型到另一个模型的外键

2 投票
3 回答
2862 浏览
提问于 2025-04-16 08:56

有没有办法让一个模型里有两个外键指向同一个模型?举个例子,我想让“日期”和“主管”这两个字段在时间表(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"

撰写回答