Джанго и технические области - PullRequest
0 голосов
/ 15 ноября 2018

Я строю модель данных. Я хочу, чтобы у каждой модели было несколько технических полей, таких как: created и updated. Я не люблю добавлять эти имена в каждую модель (вы знаете ... СУХОЙ).

Я пытался создать родительский класс с полями created и updated и наследовать его в других моделях, но ORM Джанго не помещает поля created и updated в таблицу модели, вместо этого он создает другую таблицу для двух полей и связывает ее с моделью через внешний ключ. Это не то, что я хочу.

Есть ли возможный способ?

1 Ответ

0 голосов
/ 15 ноября 2018

Я делал это несколько раз:

class TimeStampedModel(models.Model):
    """
    An abstract base class model that provides self-
    updating 'created' and 'modified' fields
    """

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

и для других моделей:

from core.models import TimeStampedModel

class MyClass(TimeStampedModel):
    """
    CLASS LAMBDA
    """
    field = models.DecimalField(verbose_name=u"Name", max_digits=7, decimal_places=2)
    field2 = models.CharField(verbose_name=u"Name 2", max_length=200)

Сейчас в ipython:

from bundle.models.my_class import MyClass
item = MyClass.objects.first()
print item.created 

Теперь created устанавливается, когда запись created (auto_now_add=True), а modified - когда вы .... modified ваша запись (auto_now=True).

Магия, это абстрактный класс ( документ здесь ):

Абстрактные базовые классы полезны, когда вы хотите поместить некоторую общую информацию в ряд других моделей. Вы пишете свой базовый класс и помещаете abstract = True в мета-класс. Эта модель не будет использоваться для создания таблицы базы данных. Вместо этого, когда он используется в качестве базового класса для других моделей, его поля будут добавлены к полям дочернего класса.

...