Я столкнулся с небольшим количеством уникальной проблемы и хотел посмотреть, какое решение соответствует наилучшей практике, или я что-то упустил в своем дизайне.
У меня есть модель - на ней есть поле, представляющее метрику. Эта метрика является внешним ключом для объекта, который может поступать из нескольких таблиц базы данных.
Идея первая:
Несколько полей ForeignKey. У меня будут преимущества каскадных опций, прямого доступа к экземпляру модели внешнего ключа из MyModel
(хотя это легко добавить свойство) и связанных поисков. Подводные камни включают необходимость проверки произвольного количества полей в модели для FK. Другая логика заключается в том, чтобы убедиться, что только одно поле FK имеет значение в определенный момент времени (легко проверить перед сохранением), хотя .update
создает проблему. Затем в базу данных было добавлено место из всех столбцов, хотя это не так.
class MyModel(models.Model):
source_one = models.ForeignKey(
SourceOne,
null=True,
blank=True,
on_delete=models.SET_NULL,
db_index=True
)
source_two = models.ForeignKey(
SourceTwo,
null=True,
blank=True,
on_delete=models.SET_NULL,
db_index=True
)
source_three = models.ForeignKey(
SourceThree,
null=True,
blank=True,
on_delete=models.SET_NULL,
db_index=True
)
Идея вторая:
Сохранение source_id и source в модели. Наибольшее беспокойство у меня вызывает необходимость сохранения логики для установки этих полей в нуль, если источник удален. В противном случае это кажется более чистым решением, но не уверен, что затраты на обеспечение точности данных того стоят. Я, вероятно, могу написать некоторую логику в хуке удаления на моделях fk, чтобы очистить MyModel
при необходимости.
class MyModel(models.Model):
ONE = 1
TWO = 2
THREE = 3
SOURCES = (
(ONE, "SourceOne"),
(TWO, "SourceTwo"),
(THREE, "SourceThree")
)
source_id = models.PositiveIntegerField(null=True, blank=True)
source = models.PositiveIntegerField(null=True, blank=True, choices=SOURCES)
Мне бы очень хотелось мнение сообщества.