2009-06-29 8 views
44

Tengo un puñado de registros que me gustaría ordenar en función de un valor calculado. Tengo la respuesta over here ... de este modo:django - convertir una lista a un conjunto de consulta

sorted(Profile.objects.all(), key=lambda p: p.reputation) 

en una clase de perfil de esta manera:

class Profile(models.Model): 

    ... 

    @property 
    def reputation(self): 
     ... 

Por desgracia la vista genérica espera un objeto de queryset y emite un error si le doy una lista .

¿Hay una manera de hacer esto que devuelve un conjunto de consultas

o ...

¿Puedo convertir una lista a un conjunto de consultas de alguna manera? No se pudo encontrar nada parecido en los documentos de django.

Espero no desnormalizar los datos, pero supongo que lo haré si es necesario.

actualización/Respuesta:

parece que la única manera de conseguir un conjunto de consultas de espalda es si usted puede conseguir toda la lógica en las consultas SQL.

Cuando eso no es posible, (creo) que necesita para desnormalizar los datos

+2

No es una mejor pregunta "¿Cómo puedo pasar una lista (o diccionario) a una vista genérica"? Supongo que si resolvieras eso, no importaría si lo hiciste convirtiéndolo en un conjunto de preguntas o no ... –

+0

sí ... lo es, pero solo quería saber si había una manera fácil de convertirlo a un conjunto de preguntas antes de salir bifurcando las vistas genéricas;) – Jiaaro

+2

mods, esto no es un duplicado. Es una pregunta diferente a la que la respuesta es: "no puedes hacer eso, entonces tienes que hacer otra cosa". Ese "algo más" se describe en la otra pregunta. – Jiaaro

Respuesta

21

no hay ningún punto en la conversión de una lista de datos de nuevo a una consulta. Un objeto de consulta nunca contiene datos; solo representa una consulta a la base de datos. Tendría que buscar todo de nuevo si hiciera su lista para una consulta, y eso sería redundante y muy mal para el rendimiento.

Lo que puede hacer:

  • Describir cómo se calcula el campo reputation; probablemente sea posible ordenar los datos en la base de datos de alguna manera.
  • Modificar la vista para no requerir un objeto de consulta. Si necesita hacer un filtrado adicional, esto debe hacerse antes de cualquier pedido, ya que el pedido tomará menos tiempo con menos entradas (y se obtendrán menos datos de la base de datos). Así que podría enviar el objeto de consulta filtrado al género función justo antes de enviarlo a la plantilla (que no debe preocuparse de si se trata de una consulta o una lista.)
+2

reputación es una propiedad, no un campo ... por lo que no es válido – Jiaaro

+1

Bueno, en ese caso, debe almacenarlo como un campo (los datos redundantes no siempre son malos si ayuda al rendimiento, incluso en bases de datos normalizadas) o usted debe ordenar por otra cosa. Supongo que es un campo calculado o unido, y puede ordenarlos también con el modelo de base de datos Django. – Blixt

+0

solo tenía una idea ... ya que la vista genérica quiere hacer algún tipo de filtrado, ¿por qué no hago la clasificación con una etiqueta de plantilla? – Jiaaro

70

Ok ... este post es antiguo, pero ahora lo que podría hacer es obtener toda la ids de los objetos en su lista, luego realice un model.objects.filter(pk__in=list_of_ids)

+1

Esto es muy lento para colecciones grandes, pero fue valioso en la situación limitada en la que lo necesitaba para resolver rápidamente un problema. Le permite usar métodos QuerySet en listas de objetos, lo que puede ser útil para un código breve. –

+17

La desventaja de esto es que no mantendrá el orden original – yprez

+1

Esto funcionó bien para un prototipo rápido, pero ciertamente no recomiendo hacerlo en producción, por las razones @Blixt especificado. – kqr

Cuestiones relacionadas