Действительно ли абстрактные модели django настолько полезны?

#python #django

Вопрос:

Я недавно столкнулся с этим в одном из сообщений в блоге, связанных с django!

 class Client(models.Model):
   name = models.CharField(max_length=255, required=True)
   # .. other fields
   class Meta:
     abstract = True
 

Прочитав документы, я не смог понять, какова цель «абстрактного = истинного».
Любая помощь будет полезна. Спасибо!

Комментарии:

1. Обычно это делается для наследования от модели и, таким образом, позволяет избежать повторения кода.

2. Ссылка: docs.djangoproject.com/en/3.2/topics/db/models/…

Ответ №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 его в Мета-класс. Затем эта модель не будет использоваться для создания какой-либо таблицы базы данных. Вместо этого, когда он используется в качестве базового класса для других моделей, его поля будут добавлены к полям дочернего класса.

Лично я обнаружил, что одним из многих преимуществ использования абстрактных моделей является то, что они допускают расширение программного обеспечения и запрещают модификации в соответствии с ТВЕРДЫМИ принципами.