#python #django #django-models
Вопрос:
Есть a PlainModel
, у которого есть такие атрибуты , как name
, color
— и a slug
, который должен быть уникальным. Я хочу сделать свою собственную версию этого, ExtendedModel
и это тоже есть size
. Итак, я сделал модель наследуемой от PlainModel
:
class ExtendedModel(PlainModel):
size = models.IntegerField(...)
Однако я столкнулся с проблемой — из — за того, как работает наследование модели Django, ExtendedModel
в таблице базы данных есть только два столбца-один для size
и один для указателя на исходную PlainModel
таблицу. Это означает, что уникальное ограничение на slug
применяется для обеих моделей, и не может быть такого ExtendedModel
же slug
, как уже существующее PlainModel
. Я не хочу такого поведения, slug
буквы s будут появляться только в контексте каждой модели отдельно (например /products/{slug}
, и /products/extended/{slug}
), поэтому нет причин обеспечивать уникальность для них обоих. Можно ли сделать так, чтобы ограничение применялось только для каждой модели соответственно?
Очевидным способом было бы, чтобы таблицы были полностью разделены, что, однако, похоже, не поддерживает Django. PlainModel
должна была бы быть «Абстрактная модель», которую я не могу контролировать. ( PlainModel
определяется во внешней библиотеке.) Другим способом было бы ослабить ограничение уникальности и проверить мой собственный код — что, по-видимому, не является отличным решением, я бы предпочел, чтобы оно все еще обеспечивалось на уровне базы данных. Наконец, я мог бы просто скопировать и вставить соответствующие атрибуты из PlainModel
в ExtendedModel
, но тогда я потеряю преимущества «наследования» (т. Е. Гарантирую, что модели имеют некоторый набор общих атрибутов).
Комментарии:
1. Если
ExtendedModel
это абстрактная модель (abstract = True
вMeta
), то уникальность будет распространяться только на дочерние модели.2. Итак , я бы создал абстракцию
AbstractExtendedModel
, которая наследуется отPlainModel
, а затем «фактическую»ExtendedModel
, которая наследуется отAbstractExtendedModel
?