2009-12-30 12 views
8

Dati i seguenti modelli:Django: Filtraggio sul oggetto correlato, rimuovendo i duplicati dal risultato

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

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

Sto cercando di passare il seguente a un modello:

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} 

Tuttavia ", Blog .objects.filter (...) "restituisce lo stesso oggetto Blog più volte se viene trovata più di una voce corrispondente.

Come si rimuovono i duplicati? O meglio ancora, mi manca un modo più semplice per passare l'elenco delle partite ai modelli?

+2

Ho essenzialmente lo stesso problema (ma più ovvio). PERCHÉ CI SONO DUPLICATI AL PRIMO POSTO? Non si suppone che 'filter' debba RESTRICT l'insieme? Penso che sia un bug nel django, non è vero? È un po 'come https://code.djangoproject.com/ticket/12625 – osa

risposta

14

L'aggiunta di ti darà solo risultati distinti.

+0

Un punto sottile da notare se si usa distinto con un nome di campo ex distinto (' field_name '), non funzionerà su mysql e * only * funziona per pgsql. src: https://docs.djangoproject.com/en/1.4/ref/models/querysets/#django.db.models.query.QuerySet.distinct scorri fino a "Note". Mi sono sbattuto la testa per un'ora, ora penso che avrei dovuto leggere chiaramente il documento. :) –

6

Vedere la QuerySet API Docs per la funzione "distinti()":

restituisce un nuovo QuerySet che utilizza SELECT DISTINCT nella sua query SQL. Questo elimina le righe duplicate dai risultati della query .

Per impostazione predefinita, un QuerySet non sostituirà righe duplicate. In pratica, questo è raramente un problema, perché le query semplici come Blog.objects.all() non introducono la possibilità di righe di risultati duplicati. Tuttavia, se la query si estende su più tabelle , è possibile ottenere risultati duplicati quando viene valutato un oggetto QuerySet. Ecco quando useresti distinct().

Problemi correlati