2009-12-23 10 views
6

Tengo el siguiente código:Escribir un gestor de filtrar conjunto de resultados de consulta

class GroupDepartmentManager(models.Manager): 
    def get_query_set(self): 
    return super(GroupDepartmentManager, self).get_query_set().filter(group='1') 

class Department(models.Model): 
name = models.CharField(max_length=128) 
group = models.ForeignKey(Group) 
def __str__(self): 
    return self.name 
objects = GroupDepartmentManager() 

... y funciona bien. Lo único es que tengo que reemplazar group='1' con group=(the group specified by group = models.ForeignKey(Group)). Estoy teniendo bastante tiempo tratando de determinar si esa clave externa debe pasarse a la clase, o a la función get_query_set, o qué. Sé que puede lograr esto con group.department_set.filter(group=desired group), pero estoy escribiendo este modelo para el sitio de administración, así que necesito usar una variable y no una constante después del signo =.

+2

Tengo algunos problemas para entender lo que está tratando de lograr. ¿Desea que department_instance.objects.all() devuelva solo los departamentos que están en el mismo grupo que department_instance? - Maciej Pasternacki 0 secs ago –

+0

Sí John su caso no está claro. ¿Qué definió qué grupo debe ser seleccionado por Department.objects.all(), por ejemplo? – kibitzer

+0

Bien, entonces hay una lista de Grupos. Cada grupo tiene algunos departamentos. También tengo algunos empleados. Cada empleado pertenece exactamente a un Grupo y un Departamento. Cuando edito un empleado, la lista desplegable de departamentos muestra todos los departamentos en la base de datos, no solo los departamentos en el grupo de empleados. Por lo tanto, solo quiero mostrar los departamentos en el grupo de empleados. Pensé que podría hacer esto al limitar los resultados de department_set a los departamentos dentro de un grupo en particular. Tal vez estoy realmente confundido. Pero eso es lo que estoy tratando de lograr. – John

Respuesta

4

Tengo la corazonada de que reemplazar el predeterminado Manager en objects de esta manera podría no ser una buena idea, especialmente si planea usar el sitio de administración ... Incluso si lo ayuda con sus Empleados, ganó ' Te ayudo en todo cuando manejas Departamentos. ¿Qué tal una segunda propiedad que proporciona una vista restringida en Departamentos junto con el objects habitual? O mueva el estándar Manager de objects a _objects y cambie el nombre a from_same_group por objects si realmente prefiere su enfoque original para su aplicación.

class Department(models.Model): 
    name = models.CharField(max_length=128) 
    group = models.ForeignKey(Group) 
    def __str__(self): 
     return self.name 
    objects = models.Manager() 

    @property 
    def from_same_group(self): 
     return Department.objects.filter(group__exact=self.group) 

Además, entiendo que sabe cómo configurar el sitio de administración para tomar ventaja de la divertida Manager; si no (o si entendí mal tu pregunta de alguna manera), deja un comentario, trataré de hacer un seguimiento pronto.


EDIT: bien, para hacer esto más claro: si lo hace absolutamente insiste en sustitución de objects, lo que probablemente quiere hacer esto:

class Department(models.Model): 
    name = models.CharField(max_length=128) 
    group = models.ForeignKey(Group) 
    def __str__(self): 
     return self.name 

    _objects = models.Manager() 

    @property 
    def objects(self): 
     # note the _objects in the next line 
     return Department._objects.filter(group__exact=self.group) 
+0

Me temo que no tengo ni idea. Cambié from_same_publisher a from_same_group. Pero, ¿no querría decir objects = from_same_publisher()? – John

+0

Ouch, el bit del editor proviene de donde usé un código similar ... De todos modos, voy a editar para aclarar las cosas. –

+0

Gracias, pero agregué esto a la clase Departamento, y el cuadro de selección aún muestra todos los objetos del Departamento. Creo que todavía tengo que configurar la página de administración para, como indicó, aprovechar esta configuración. Estoy confundido porque pensé que todo el negocio de Manager se realizó dentro de models.py, sin cambios en admin.py. – John

2

Es posible que desee reconsiderar la relación entre los grupos y departamentos si encuentra que tratar de crear un administrador personalizado es demasiado complejo. Los gerentes se destacan en la simplificación de consultas comunes, pero no logran mostrar relaciones complejas entre modelos e instancias de modelos.

Sin embargo, creo que este artículo sobre filtering model objects with a custom manager lo orientará en la dirección correcta. El autor propone una técnica para realizar una llamada a función que devuelve una clase de administrador personalizada que tiene los parámetros de filtro que especificó guardados en la clase para que no se pasen a la instancia. ¡Hazlo!

+0

Gran enlace, gracias. Definitivamente es un truco, pero intentaré esto e informaré. – John

+0

¡De ninguna manera! ¡Es demasiado dinámico para ser un hack! De hecho, creo que es bastante inteligente. – jathanism

+0

¡Bastante justo! Implementé esto con "objects = get_filter_manager (group = group)" en la clase Department y recibí el mismo tropiezo que siempre he recibido antes: "el objeto 'str' no tiene el atributo 'creation_counter'". Parece que no puedo codificar el código, o podría publicarlo aquí. – John

Cuestiones relacionadas