2010-08-14 17 views
8

Tengo el campo 'envío' que tiene un usuario y un problema. ¿Cómo puedo obtener un resultado de búsqueda SQL que dará una lista de un solo resultado por par de usuario y problema?Selección de consulta Django distinta por pares de campos

modelos son así:

class Problem(models.Model): 
    title = models.CharField('Title', max_length = 100) 
    question = models.TextField('Question') 

class Submission(models.Model): 
    user = models.ForeignKey(User) 
    problem = models.ForeignKey(Problem) 
    solution = models.CharKey() 
    time = models.DateTimeField('Time', auto_now_add=True) 
+0

¿Qué quiere decir con "campo que tiene un usuario y un problema"? ¿Estás hablando de los modelos de Django? Publica el código relevante. –

+0

modelos son así: Problema: título, cuestionar de presentación: problema (ForeignKey), usuario (ForeignKey), el contenido usuario: usuario de autenticación Tengamos p1 Supongamos, dos problemas p2 y U1, U2 son dos usuarios U1 tiene dos envíos s1, s2 para p1 y uno (s3) para p2 y u2 tienen uno para p1 (s4), dos para p2 (s5, s6) Así que quiero un resultado de conjunto de preguntas como este: s2, s3, s4, s6 es decir, descuidar los viejos con el mismo problema de usuario s2, s3, – crodjer

Respuesta

3

Actualización 2:

(Después de leer los comentarios de OP) Yo sugiero agregar un nuevo modelo para realizar un seguimiento de la última presentación. Llámelo LatestSubmission.

class LatestSubmission(models.Model): 
    user = models.ForeignKey(User)  
    problem = models.ForeignKey(Problem) 
    submission = models.ForeignKey(Submission) 

A continuación, puede

  1. anulación Submission.save() para crear/actualizar la entrada en LatestSubmission cada vez que un usuario publica una nueva solución para un problema
  2. adjuntar una función que hace lo mismo a una adecuado signal.

tal que LatestSubmission contendrá una fila por combinación de usuario-usuario de problema que apunte a la última presentación del problema por cada usuario. Una vez que tenga esto en su lugar se puede disparar una sola consulta:

LatestSubmission.objects.all().order_by('problem') 

actualización:

Desde el PO ha publicado código de ejemplo, la solución puede cambiarse de la siguiente manera:

for user in User.objects.all(): # Get all users 
    user.submission_set.latest('time') # Pick the latest submission based on time. 

Original Respuesta

En ausencia de cualquier fecha/hora basada Para decidir qué es "más antiguo" o "más nuevo", puede usar la clave principal (id) del Submission para "descuidar los antiguos".

for user in User.objects.all(): # Get all users 
    user.submission_set.latest('id') # Pick the latest submission by each user. 
+0

Agregué los detalles del modelo a mi problema. Esto me dará solo el conjunto de consultas de último envío por parte de un usuario y lo que quiero es el último resultado para todos los problemas. Quiero ejecutar un comando sql en el campo de envío y obtener la lista de envíos ordenados por tiempo de envío e incluirá solo un resultado si hay más de un envío de un mismo usuario en un problema. – crodjer

+0

@Rohan Jain: no estoy seguro si puede hacer eso con _una_ consulta SQL dada su _current_ estructura de modelo. Me gustaría saber si alguien más aquí puede encontrar una respuesta adecuada. –

+0

estoy haciendo esto ahora agregando un campo booleano is_latest para la presentación ..... thanx fr ur helps :) – crodjer

12

Prueba esto:

distinct_users_problems = Submission.objects.all().values("user", "problem").distinct() 

que le dará una lista de dicts como éste:

[{'problem': 1, 'user': 1}, {'problem': 2, 'user': 1}, {'problem': 3, 'user': 1}] 

que contiene todos los pares distintos.

En realidad resulta en su consulta SQL SELECT DISTINCT usual.

Cuestiones relacionadas