Сделайте первичный ключ уникальным для нескольких дочерних классов с общим родителем
У меня есть django-polymorphic модель следующего вида:
from polymorphic.models import PolymorphicModel
class Item(PolymorphicModel):
sku = models.CharField(primary_key=True, max_length=32)
class Car(Item):
pass
class Boat(Item):
pass
К моему ужасу, можно создавать экземпляры подклассов с одним и тем же первичным ключом:
Car.objects.create(sku='123')
Boat.objects.create(sku='123') # Does NOT crash but I want it to
Но, конечно, попытка получить доступ к созданному объекту приведет к ужасному провалу:
>>> Car.objects.get(sku='123')
polymorphic.models.PolymorphicTypeInvalid: ContentType 42 for <class 'demo_application.models.Car'> #123 does not point to a subclass!
Как сделать так, чтобы все экземпляры Item
имели уникальный первичный ключ?
Один из вариантов, который я рассматривал, - это переопределение методов save
для Car
и Boat
или прослушивание сигналов pre_save
. Однако это добавит запрос к базе данных каждый раз, когда я их сохраняю, и это кажется халтурным решением.
Я бы изменил одну строчку
sku = models.CharField(unique=True, max_length=32)
В Django не рекомендуется использовать поле в качестве первичного ключа в дочерних моделях. Это может привести к неожиданному поведению, поскольку Django автоматически создает и использует *_ptr_id
в качестве первичного ключа для дочерних моделей
UPDATE: Я рекомендую использовать django-typed-models, это обеспечит уникальный первичный ключ для каждого подкласса, вы не сможете установить один и тот же первичный ключ для двух объектов.