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)