2010-08-14 13 views
8

Ich habe das Feld 'Einreichung', die einen Benutzer und ein Problem hat. Wie kann ich ein SQL-Suchergebnis erhalten, das eine Liste von nur einem Ergebnis pro Benutzer-Problem-Paar ergibt?Django Abfrage wählen Sie eindeutig nach Feld-Paare

Modelle sind wie folgt aus:

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

Was meinst du mit "Feld, das einen Benutzer und ein Problem hat"? Sprechen Sie über Django-Modelle? Veröffentlichen Sie den entsprechenden Code. –

+0

Modelle sind wie folgt: Problem: Titel, in Frage Unterwerfung: Problem (foreignkey), Benutzer (foreignkey), Inhalt Benutzer: Auth-Benutzer Nehmen wir an, p1, p2 zwei Probleme und u1, u2 sind zwei Benutzer u1 hat zwei Übergaben s1, s2 für p1 und eins (s3) für p2 und u2 hat einen für p1 (s4), zwei für p2 (s5, s6) Also ich möchte ein Abfrageergebnis wie folgt: s2, s3, s4, s6 dh vernachlässige die alten mit gleichem user-problem s2, s3, – crodjer

Antwort

3

Update 2:

(Nach Kommentare OP liest) Ich habe ein neues Modell empfiehlt das Hinzufügen der neuesten Vorlage zu verfolgen. Nennen Sie es LatestSubmission.

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

Sie können dann entweder

  1. Überschreibung Submission.save() erstellen/aktualisieren Sie den Eintrag in LatestSubmission jedes Mal einem Beitrag Benutzer eine neue Lösung für ein Problem
  2. fügen Sie eine Funktion, die das gleiche zu einem tut geeignet signal.

so dass LatestSubmission eine Zeile pro Problem-Benutzer-Einreichung-Kombination enthält, die auf die neueste Einreichung für das Problem von jedem Benutzer zeigt. Sobald Sie dies an Ort und Stelle haben, können Sie eine einzelne Abfrage Feuer:

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

aktualisieren:

Da die OP Beispielcode geschrieben hat, kann die Lösung nun wie folgt geändert werden:

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

Ursprüngliche Antwort

In Abwesenheit von Datum/Uhrzeit basiert Kriterien für die Entscheidung, welche "älter" oder "neuer" ist, können Sie den Primärschlüssel (id) von verwenden, um die alten "zu vernachlässigen".

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

ich habe die modelldetails zu meinem problem hinzugefügt. Dies wird mir nur die Abfrage Set der letzten Einreichung von einem Benutzer und was ich will, ist das neueste Ergebnis für alle Probleme. Ich möchte einen sql-Befehl im Feld "Submission" ausführen und die Liste der Submissionen erhalten, die nach der Submissionszeit geordnet sind, und nur ein Ergebnis enthalten, wenn es mehr als eine Submission desselben Benutzers in einem Problem gibt. – crodjer

+0

@Rohan Jain: Ich bin nicht sicher, ob Sie das mit _one_ SQL-Abfrage mit Ihrer _current_ Modellstruktur tun können. Ich würde gerne wissen, ob jemand anders hier eine passende Antwort finden kann. –

+0

Ich mache das jetzt, indem ich ein boolesches Feld is_latest für die Einreichung hinzufüge ..... danke hilft :) – crodjer

12

Try this:

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

Es Sie wie dieser eine Liste von dicts geben:

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

alle verschiedene Paare enthält.

Es führt tatsächlich zu Ihrer üblichen SELECT DISTINCT SQL-Abfrage.