2009-12-30 6 views
8

Angesichts der folgenden Modelle:Django: Filtern auf dem verwandten Objekt, das Entfernen von Duplikaten aus dem Ergebnis

class Blog(models.Model): 
    name = models.CharField() 

class Entry(models.Model): 
    blog = models.ForeignKey(Blog) 
    content = models.CharField() 

Ich suche folgendes Vorlage weitergeben müssen:

blogs = Blog.objects.filter(entry__content__contains = 'foo') 
result = [(blog, blog.entry_set.filter(content__contains = 'foo')) 
      for blog in blogs] 
render_to_response('my.tmpl', {'result': result} 

jedoch „Blog .objects.filter (...) "gibt dasselbe Blog-Objekt mehrmals zurück, wenn mehr als ein übereinstimmender Eintrag gefunden wird.

Wie entfernen Sie die Duplikate? Oder besser noch, fehlt mir eine einfachere Möglichkeit, die Liste der Treffer an die Vorlagen zu übergeben?

+2

Ich habe im Wesentlichen das gleiche (aber offensichtlicher) Problem. WARUM SIND DIE DOPPELTEN VORTEILE? Soll 'filter' nicht das Set EINSCHRÄNKEN? Ich denke, es ist ein Fehler im Django, oder? Es ist ein bisschen wie https://code.djangoproject.com/ticket/12625 – osa

Antwort

14

Hinzufügen .distinct() wird Ihnen nur eindeutige Ergebnisse geben.

+0

Ein subtiler Punkt zu beachten, wenn Sie distinct mit einem Feldnamen ex distinct ('field_name') verwenden, funktioniert es nicht auf mysql und * nur * funktioniert für pgsql. src: https://docs.djangoproject.com/de/1.4/ref/models/querysets/#django.db.models.query.QuerySet.distinct blättern Sie zu "Note". Ich knallte nur eine Stunde lang mit dem Kopf darauf, jetzt dachte ich, ich hätte das Dokument klar lesen sollen. :) –

6

Siehe QuerySet API Docs für die "distinct()" Funktion:

Gibt ein neues QuerySet, das in seiner SQL-Abfrage SELECT DISTINCT verwendet. Dieses entfernt doppelte Zeilen aus den Abfrage-Ergebnissen .

Standardmäßig wird ein QuerySet keine doppelten Zeilen entfernen. In der Praxis ist das selten ein Problem, weil einfache Abfragen wie Blog.objects.all() die Möglichkeit von doppelten Ergebniszeilen nicht einführen. Wenn Ihre Abfrage jedoch mehrere Tabellen umfasst, ist es möglich, doppelte Ergebnisse zu erhalten, wenn ein QuerySet ausgewertet wird. Das ist, wenn Sie distinct() verwenden würden.

Verwandte Themen