2009-12-30 14 views
8

Dados los siguientes modelos:Django: Filtrado en el objeto relacionado, la eliminación de duplicados de los resultados

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

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

Estoy buscando para pasar el siguiente para una plantilla:

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} 

Sin embargo ", Blog .objects.filter (...) "devuelve el mismo objeto de Blog varias veces si se encuentra más de una entrada coincidente.

¿Cómo se eliminan los duplicados? O mejor aún, ¿me está faltando una forma más sencilla de pasar la lista de coincidencias a las plantillas?

+2

Tengo esencialmente el mismo problema (pero más obvio). ¿POR QUÉ HAY DUPLICADOS EN PRIMER LUGAR? ¿No se supone que 'filtro 'RESTRINGE el conjunto? Creo que es un error en django, ¿no? Es algo así como https://code.djangoproject.com/ticket/12625 – osa

Respuesta

14

Agregar .distinct() solo le dará resultados distintos.

+0

Un punto sutil que debe tenerse en cuenta si utiliza distinct con un nombre de campo ex distinct ('field_name'), no funcionará en mysql y * only * funciona para pgsql. src: https://docs.djangoproject.com/en/1.4/ref/models/querysets/#django.db.models.query.QuerySet.distinct desplácese a "Nota". Solo me di un golpe en la cabeza durante una hora, ahora pensaba que debería haber leído el documento con claridad. :) –

6

Véase el QuerySet API Docs para la función "distinta()":

devuelve un nuevo QuerySet que utiliza SELECT DISTINCT en su consulta SQL. Este elimina las filas duplicadas de los resultados de la consulta .

De manera predeterminada, un QuerySet no eliminará las filas duplicadas de . En la práctica, esto rara vez es un problema, porque consultas simples como Blog.objects.all() no introducen la posibilidad de filas de resultados duplicados. Sin embargo, si su consulta abarca varias tablas , es posible obtener resultados duplicados cuando se evalúa un QuerySet. Ahí es cuando usar distinct().

Cuestiones relacionadas