Django ManyToOne ссылается на несколько таблиц

Сейчас у меня есть следующая модель, которую я хотел бы использовать в разных моделях (я хочу хранить день недели и время в разных моделях):

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 (конечно, это не помешает вам создать другой объект 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, то вам понадобится отношение many to many:

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)

Я создаю DayTime модель для каждого класса по мере необходимости. Я хотел создать модель, которую было бы легче использовать повторно, но в этом случае я мог бы просто создать абстрактный базовый класс и реализовать его. До сих пор мне не требовалось более одной модели в любом случае.

Пример

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)

Тогда это облегчает мне масштабирование, создание специфических сериализаторов и т.д. Если я захочу сделать запрос на основе дня с двумя разными моделями, я все равно смогу это сделать.

Вернуться на верх