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

У меня есть 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, это обеспечит уникальный первичный ключ для каждого подкласса, вы не сможете установить один и тот же первичный ключ для двух объектов.

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