Один из вариантов заключается в том, чтобы ваши модели были такими (в основном то, что вы уже предложили):
class EngineType(models.Model):
...
is_active = models.BooleanField(
default=True)
...
class Car(models.Model):
...
engine_type = models.ForeignKey(
to=EngineType,
on_delete=models.PROTECT)
...
и никогда не удаляйте экземпляры EngineType
, которые когда-либо использовались.Старые двигатели должны быть помечены как instance.is_active = False
.
Затем в ваших формах и представлениях вам необходимо будет проверить, что только новые активные экземпляры EngineType
могут быть назначены новым автомобилям.Есть некоторые вопросы, которые касаются этого, например этот .
Это может выглядеть так (при условии, что вы используете ModelForm
):
class CarForm(ModelForm):
class Meta:
model = Car
fields = [
...
'engine_type',
...
]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['engine_type'].queryset = EngineType.objects.filter(is_active=True)
Этот кодбудет гарантировать, что с помощью этой формы этому автомобилю можно будет назначить только активные двигатели.
Вам просто нужно убедиться, что типы двигателей нельзя изменить с помощью другого вида или формы, или встроить те же проверки в них.