django inheritance model meta mixins

Django: Creando un Mixin para campos modelo reutilizables



inheritance meta (1)

Tengo algunos campos que quiero agregar a casi todos los modelos de mi proyecto. Por ejemplo, estos campos son "campos de seguimiento", como una fecha de creación, una fecha de actualización y una marca "activa". Estoy intentando crear un Mixin que podría agregar a cada clase de modelo que me permita agregar estos campos adicionales a través de la herencia múltiple. Sin embargo, cuando se crea una instancia de objeto, parece que los campos de mi modelo que se agregaron a través del Mixin aparecen como métodos del objeto en lugar de campos de la base de datos.

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

Aquí es cómo se ven mis modelos:

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

Así que esto no parece funcionar. ¿Alguien sabe cómo puedo crear una mezcla reutilizable para campos de modelos comunes similares a los anteriores? ¿Hay algún defecto en este enfoque?

Gracias por tu ayuda Joe

Actualización: Tenga en cuenta que algunos de mis modelos que planeo usar la mezcla en uso el modelo MPTT, así que no puedo simplemente hacer que mi mezcla TrackingFieldMixin sea la clase base y heredar solo de ella.

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


Los modelos abstractos todavía necesitan heredar de model.Model para funcionar correctamente:

class TrackingFieldsMixin(models.Model):

Además, en lugar de su BooleanField active , agregaría un deleted_on DateTimeField para que pueda grabar cuando se eliminó el registro. Luego puede simplemente agregar propiedades en la instancia para ver si está activa:

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

y en consultas y / o un gestor personalizado :

Blog.objects.filter(deleted_on__isnull=True)