2010-03-03 15 views
5

He alterado el administrador predeterminado en algunos de los objetos que un GenericForeignKey() puede hacer referencia de modo que esos objetos pueden no aparecer más dentro de ese administrador predeterminado.Usando un administrador no predeterminado con GenericForeignKey()

Tengo otros administradores que podrán encontrar estos objetos borrados, pero no veo la forma de contarles el marco de tipos de contenido sobre ellos. es posible?

Me estoy poniendo en práctica 'eliminación suave' con algunos modelos que implica los siguientes gestores:

from django.db import models 

SDManager(models.Manager): 

    def get_query_set(self): 
     return super(SDManager, self).get_query_set().filter(is_deleted=False) 

SDDeletedManager(models.Manager): 

    def get_query_set(self): 
     return super(SDDeletedManager, self).get_query_set().filter(is_deleted=True) 

Esto me permite hacer lo siguiente:

SDModel(models.Model): 
    # ... 
    objects = SDManager() # Only non (soft) deleted objects 
    all_objects = models.Manager() # The default manager 
    deleted_objects = SDDeletedManager() # Only (soft) deleted objects 

Cuando se utiliza un campo GenericForeignKey() en un modelo para hacer referencia a un objeto definido como SDModel, utiliza el atributo _default_manager que evalúa al administrador objects, para obtener la referencia. Esto significa que pierde referencias cuando los objetos son borrados por software.

Esta fue una de las principales razones por las que estaba usando los campos GenericForeignKey(). Una solución que he estado dando vueltas es implementar una versión menor de la estructura de tipos de contenido, de modo que pueda definir mi propio get_object() que utiliza el administrador all_objects para acceder al objeto de referencias.

Así que mi pregunta realmente es:

¿Es posible utilizar un gestor no predeterminada con el marco de tipos de contenido existente para que encuentre los objetos eliminados suaves, o voy a tener que volver a poner en práctica todo el partes que necesito desde cero?

+0

Es posible que deba entrar en más detalles y publicar código de ejemplo. – stefanw

+0

He agregado más detalles para darle una idea más clara de mi dilema. –

+0

Disculpe si me falta algo obvio, pero ¿ha considerado mantener los "objetos" como los modelos predeterminados. ¿Administra el administrador y nombra al SDManager como algo más? es decir, intercambiando las definiciones de objetos y todos_objetos? –

Respuesta

2

Tengo exactamente el mismo problema que usted, y después de echar un vistazo a la documentación/fuente, parece que Django no proporciona una forma original de hacerlo. El método más simple que encontré fue crear la subclase GenericForeignKey y luego anular el método __get__.

The troublesome line es donde se llama:

rel_obj = ct.get_object_for_this_type(pk=getattr(instance, self.fk_field)) 

lo tanto necesita esta línea para ser reescrita como:

rel_obj = ct.model_class().all_objects.get(pk=getattr(instance, self.fk_field)) 

Es un poco hacker pero funciona, y luego llegar a usar la completa poder de GenericForeignKey como lo haría normalmente.

Cuestiones relacionadas