2010-04-16 60 views
8

試圖檢索博客(見下文模型描述)包含滿足某些標準的條目:Django的查詢集過濾方法返回多個條目爲一個記錄

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

結果是:

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

相同由於執行JOIN以過濾相關模型上的對象,因此博客對象被檢索兩次。什麼是僅過濾唯一對象的正確語法?

數據模型:

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 

樣本數據:

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

回答

12

使用不同()

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

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

+0

感謝。我只是沒有預料到來自神奇的ORM的這種行爲:)該文件實際上提到了這種情況,但我預計它將在有關查詢相關對象的章節中進行介紹。 – Yaroslav 2010-04-16 15:58:43

+0

您可以添加鏈接到文檔的相應部分以供參考? – m000 2012-10-12 17:28:08

5

使用distinct方法

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

+1謝謝。喬希是第一個接受他答案的人。 – Yaroslav 2010-04-16 16:02:55