Подтвердить что ты не робот

Django: создание микса для полей многоразовой модели

У меня есть несколько полей, которые я хочу добавить к большинству каждой модели в моем проекте. Например, эти поля являются "полями отслеживания", такими как дата создания, дата обновления и "активный" флаг. Я пытаюсь создать Mixin, который я мог бы добавить к каждому классу модели, что позволило бы мне добавить эти дополнительные поля через множественное наследование. Однако, когда экземпляр объекта создается, кажется, что мои поля модели, которые были добавлены через Mixin, отображаются как методы объекта, а не поля базы данных.

In [18]: Blog.objects.all()[0].created
Out[18]: <django.db.models.fields.DateTimeField object at 0x10190efd0>

Вот как выглядят мои модели:

from django.db import models

class Blog(models.Model, TrackingFieldMixin):
    name = models.CharField(max_length=64)
    type = models....


class TrackingFieldsMixin():

    active = models.BooleanField(default=True, 
        help_text=_('Indicates whether or not this object has been deleted.'))
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

Таким образом, это не работает. Кто-нибудь знает, как я могу создать многоразовый mixin для общих полей модели, похожих на выше? Есть ли недостаток в этом подходе?

Спасибо за помощь, Джо

Обновление: обратите внимание, что некоторые из моих моделей, в которых я планирую использовать mixin, используют модель MPTT, поэтому я не могу просто заставить my TrackingFieldMixin смешивать базовый класс и наследовать только от него.

class Post(MPTTModel, TrackingFieldMixin):
    post_name = models....
    post_type = models...
4b9b3361

Ответ 1

Абстрактные модели по-прежнему должны наследовать от model.Model для правильной работы:

class TrackingFieldsMixin(models.Model):

Кроме того, вместо active BooleanField я бы добавил deleted_on DateTimeField, чтобы вы могли записывать, когда запись была удалена. Затем вы можете просто добавить свойства в экземпляр, чтобы увидеть, активен ли он:

@property
def active(self):
    return self.deleted_on is None

и в запросах и/или пользовательский менеджер:

Blog.objects.filter(deleted_on__isnull=True)