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)
Тогда это облегчает мне масштабирование, создание специфических сериализаторов и т.д. Если я захочу сделать запрос на основе дня с двумя разными моделями, я все равно смогу это сделать.