Django consulta seleccionar distintos por pares de campos

Tengo el campo ‘envío’ que tiene un usuario y un problema. ¿Cómo puedo obtener un resultado de búsqueda SQL que proporcione una lista de solo un resultado por par de problemas de usuario?

Los 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) 

Actualización 2 :

(Después de leer los comentarios de OP), sugiero agregar un nuevo modelo para rastrear el último envío. Llámalo LatestSubmission .

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

Usted puede entonces o bien

  1. invalide Submission.save() para crear / actualizar la entrada en LatestSubmission cada vez que un usuario publique una nueva solución para un problema
  2. adjuntar una función que haga lo mismo a una señal adecuada.

de modo que LatestSubmission contendrá una fila por combinación de problema-usuario-envío que apunta al último envío del problema por parte de cada usuario. Una vez que tenga esto en su lugar, puede disparar una sola consulta:

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

Actualización :

Dado que el OP ha publicado un código de ejemplo, la solución ahora se puede cambiar 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. 

Respuesta original

En ausencia de criterios basados ​​en fecha / hora para decidir cuál es “más antiguo” o “más nuevo”, puede utilizar la clave principal ( id ) de Submission para “descuidar los anteriores”.

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

Prueba esto:

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

Te dará una lista de dictados como este:

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

que contiene todos los pares distintos.

En realidad, resulta en su consulta habitual SELECT DISTINCT SQL.