2011-05-16 20 views
17

Tengo algunos campos que quiero agregar a la mayoría de 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 un indicador "activo". 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 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 de Mixin aparecen como métodos del objeto en lugar de los campos de la base de datos.Django: Creación de Mixin para campos de modelo reutilizables

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

Esto es lo que mis modelos se parecen:

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 similar a la anterior? ¿Hay algún defecto en este enfoque?

Gracias por su ayuda, Joe

Actualización: Tenga en cuenta que algunos de mis modelos que va a utilizar el mixin en uso el modelo MPTT, por lo que no pueden simplemente hacer mi TrackingFieldMixin mixin la clase base y heredar solo de ella.

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

Respuesta

24

Abstract todavía tienen que heredar de model.Model para que funcione correctamente:

class TrackingFieldsMixin(models.Model): 

también en lugar de su activeBooleanField me gustaría añadir un deleted_onDateTimeField para que pueda grabar cuando el registro fue borrado. A continuación, puede simplemente añadir propiedades en la instancia para ver si es activa:

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

y en las consultas y/o una custom manager:

Blog.objects.filter(deleted_on__isnull=True) 
+0

Gracias Sdolan. Pude hacer que funcionara. Me gusta mucho el uso del campo de fecha para los elementos eliminados en lugar del booleano. Es bueno poder hacer un seguimiento de las eliminaciones y de las adiciones. –

+0

@Joe J: De nada. Y sí, siempre es bueno tener esa información adicional antes de que sea necesaria. Además, a menudo almaceno una columna deleted_by para fines de auditoría, incluso si no la necesitaré de inmediato. – sdolan

Cuestiones relacionadas