#python #django
Вопрос:
Я недавно столкнулся с этим в одном из сообщений в блоге, связанных с django!
class Client(models.Model):
name = models.CharField(max_length=255, required=True)
# .. other fields
class Meta:
abstract = True
Прочитав документы, я не смог понять, какова цель «абстрактного = истинного».
Любая помощь будет полезна. Спасибо!
Комментарии:
1. Обычно это делается для наследования от модели и, таким образом, позволяет избежать повторения кода.
Ответ №1:
Абстрактная модель используется для уменьшения объема кода и реализации общей логики в компоненте многократного использования.
Например , если у вас много моделей, в которых вы хотите определить две временные метки для created_at
и updated_at
, то мы можем начать с простой абстрактной модели:
class UpdatedCreated(models.Model):
updated_at = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
abstract = True
Если у нас теперь есть три модели, в которые мы хотим включить эти метки времени, мы можем работать с:
class Foo(UpdatedCreated):
other=models.CharField()
class Bar(UpdatedCreated):
another=models.CharField()
class Qux(UpdatedCreated):
an_another=models.CharField()
теперь все эти три модели будут иметь created_at
updated_at
поле «и». Если мы определим методы на UpdatedCreated
, то модели унаследуют это. Мы можем, например, создать поле, которое указывает, является ли элемент все еще «живым» с:
from django.utils.timezone import now
class UpdatedCreated(models.Model):
updated_at = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)
@property
def alive(self):
return (now() - updated_at).days < 7
class Meta:
abstract = True
Таким образом, это способ легко расширять модели с помощью одного и того же многоразового компонента.
Ответ №2:
Из документов
Абстрактные базовые классы полезны, когда вы хотите поместить некоторую общую информацию в ряд других моделей. Вы пишете свой базовый класс и помещаете
abstract=True
его в Мета-класс. Затем эта модель не будет использоваться для создания какой-либо таблицы базы данных. Вместо этого, когда он используется в качестве базового класса для других моделей, его поля будут добавлены к полям дочернего класса.
Лично я обнаружил, что одним из многих преимуществ использования абстрактных моделей является то, что они допускают расширение программного обеспечения и запрещают модификации в соответствии с ТВЕРДЫМИ принципами.