2012-02-23 42 views
0

我得到了這些模型:的Django 1.3:價值觀與外鍵和註釋多對多關係

from django.db import models 

class Feed(models.Model): 
    readers = models.ManyToManyField('auth.user') 
    # other fields 

class Entry(models.Model): 
    feed = models.ForeignKey(Feed) 
    read_by = models.ManyToManyField('auth.user') 
    # other fields 

一個Feed實例已全部它在readers集的讀者。如果User讀取Entry,則User被添加到read_by集合中。

現在我堅持了以下的問題:我怎樣才能得到一個User的未讀Entries計數,每FeedUser讀?

Feed側進入,下面的語句排除我所有Feeds與給定UserEntries

Feed.objects.filter(readers=user).values('public_id').annotate(models.Count('entry')).exclude(entry__read_by=user) 

從另一個Entry側進入,下面的語句不組Feeds和計數一起:

Entry.objects.exclude(read_by=user).filter(feed__readers=user).values('feed').annotate(models.Count('id')) 

編輯:

我被要求提供示例數據。所以想想下面的設置:

User U讀取三個Feeds:FeedOne,FeedTwo,FeedThree。

Feed目前有五個Entries數據庫。二FeedOne的Entries已經由User U.閱讀

摘要:

FeedOne 
    EntryA (read by U) 
    EntryB (read by U) 
    EntryC 
    EntryD 
    EntryE 
FeedTwo 
    EntryF 
    EntryG 
    EntryH 
    EntryI 
    EntryJ 
FeedThree 
    EntryK 
    EntryL 
    EntryM 
    EntryN 
    EntryO 

我需要的是未讀Entries的這個User的每個Feed計數:

FeedOne: 3 
FeedTwo: 5 
FeedThree: 5 
+0

你可以發佈示例數據和預期的查詢結果嗎?我認爲這會讓你的問題更容易理解 – jpic 2012-02-24 11:31:16

回答

0

試試這個:

feed_qs = user.feed_set.exclude(entry__read_by=user).annotate(unread_count=Count('entry')) 
for feed if feed_qs: 
    print feed, feed.unread_count 

https://docs.djangoproject.com/en/dev/topics/db/aggregation/#aggregations-and-other-queryset-clauses

+0

我有5個Feed的測試分貝。一位用戶是所有提要的讀者,但只能從其中一個提要中讀取條目。通過您的查詢,我只能得到4個其他提要的計數,但不能用於已讀條目的計數。 – Martin 2012-02-24 06:41:45