Django ManyToOne 引用多个表

Django ManyToOne reference multiple tables

现在我有以下模型,我想在不同的模型中使用(我想在不同的模型中存储星期几和时间):

class DayTime(models.Model):
    # Side note: I saw that there is a DurationField and
    # was considering using that instead of the CharField below
    day = models.CharField(max_length=9, choices=DaysOfWeekTypeEnum.choices)
    time = models.TimeField()

docs 开始,我必须在上述模型中创建一个 ForeignKey 字段以容纳 ManyToOne 引用。

示例:

class DayTime(models.Model):
    day = models.CharField(max_length=9, choices=DaysOfWeekTypeEnum.choices)
    time = models.TimeField()
    modelA = models.ForeignKey(ModelA, on_delete=models.SET_NULL)
    modelB = models.ForeignKey(ModelB, on_delete=models.SET_NULL)

这听起来不对。我应该创建不同的 DayTime 模型吗?

提前致谢。

按照您设置的方式,ModelA 可以有多个 DayTime,但一个特定的 DayTime 对象只能与一个 ModelA 对象相关联(并且您可以创建另一个具有相同值(pk 除外)和任何唯一值的 DayTime 对象字段,并将该 DayTime 与另一个 ModelA 对象相关联),虽然这对您来说似乎不正确,但这可能正是您想要的。 docs 中的示例有一个文章对象,其中一个记者作为外键,因为一个记者可以有很多文章,但一篇文章只有一个记者。

class DayTime(models.Model):
    day = models.CharField(max_length=9, choices=DaysOfWeekTypeEnum.choices)
    time = models.TimeField()
    modelA = models.ForeignKey(ModelA, on_delete=models.SET_NULL)
    modelB = models.ForeignKey(ModelB, on_delete=models.SET_NULL)

在第二种方式中,许多 ModelA 对象可以有一个特定的 DayTime 对象,但是 DayTime 对象只能与一个 ModelA 对象相关联(当然,这不会阻止您创建另一个具有相同对象的 DayTime 对象字段值(pk 和您设置为唯一的任何字段除外)。ModelB 也是如此。

class DayTime(models.Model):
    day = models.CharField(max_length=9, choices=DaysOfWeekTypeEnum.choices)
    time = models.TimeField()

class ModelA(models.Model):
    # some fields unique to ModelA
    daytime = models.ForeignKey(DayTime, on_delete=models.SET_NULL)

class ModelB(models.Model):
    # some fields unique to ModelB
    daytime = models.ForeignKey(DayTime, on_delete=models.SET_NULL)

现在,如果您需要每个 ModelA 对象具有多个 DayTime 对象,并且您还需要一个特定的 DayTime 对象与许多 ModelA 对象相关联,那么您将需要 many to many relationship:

class DayTime(models.Model):
    day = models.CharField(max_length=9, choices=DaysOfWeekTypeEnum.choices)
    time = models.TimeField()

class ModelA(models.Model):
    # some fields unique to ModelA
    daytime = models.ManyToManyField(DayTime)

class ModelB(models.Model):
    # some fields unique to ModelB
    daytime = models.ManyToManyField(DayTime)

我正在根据需要为每个 class 创建一个 DayTime 模型。我想创建一个更易于重用的模型,但如果是这样,我可以创建一个抽象基础 class 并实现它。到目前为止,我还不需要一个以上的模型。

例子

class DayTime(models.Model):
    day = models.CharField(max_length=9, choices=DaysOfWeekTypeEnum.choices)
    time = models.TimeField()

    class Meta:
        abstract = True

class DayTimeModelA(DayTime):
    modelA = models.ForeignKey(
        'ModelA', related_name="day_times", on_delete=models.CASCADE)

class DayTimeModelB(DayTime):
    modelB = models.ForeignKey(
        'ModelB', related_name="day_times", on_delete=models.CASCADE)

这让我更容易扩展、创建特定的序列化程序等。如果我想基于一天使用两种不同的模型进行查询,我仍然可以做到。