2010-04-16 10 views
8

Cercando di recuperare i blog (vedi descrizione del modello di seguito) che contengono le voci che soddisfano alcuni criteri:metodo del filtro Django QuerySet restituisce più voci per un record

Blog.objects.filter(entries__title__contains='entry') 

Il risultato è:

[<Blog: blog1>, <Blog: blog1>] 

Lo stesso l'oggetto blog viene recuperato due volte a causa dell'operazione JOIN eseguita per filtrare gli oggetti sul modello correlato. Qual è la sintassi corretta per filtrare solo oggetti unici?

modello di dati: i dati

class Blog(models.Model): 
    name = models.CharField(max_length=100) 
    def __unicode__(self): 
     return self.name 

class Entry(models.Model): 
    title = models.CharField(max_length=100) 
    blog = models.ForeignKey(Blog, related_name='entries') 
    def __unicode__(self): 
     return self.title 

Esempio:

b1 = Blog.objects.create(name='blog1') 
    e1 = Entry.objects.create(title='entry 1', blog=b1) 
    e1 = Entry.objects.create(title='entry 2', blog=b1) 

risposta

12

Usa distinta()

cioè .:
Blog.objects.filter(entries__title__contains='entry').distinct()

http://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct

+0

Grazie. Non mi aspettavo un simile comportamento dal magico ORM :) Il documento menziona effettivamente questa situazione ma mi aspettavo che fosse descritto nella sezione sull'interrogazione degli oggetti correlati. – Yaroslav

+0

Potresti aggiungere un collegamento alle rispettive parti dei documenti come riferimento? – m000

5

utilizzare il metodo distinct

Blog.objects.filter(entries__title__contains='entry').distinct() 
+1

+1 Grazie. Josh è stato il primo a rispondere, accettando la sua risposta. – Yaroslav

Problemi correlati