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获取User读取的每个Feed的未读Entries计数?

来自Feed侧,以下语句排除了给定User的所有读取EntriesFeeds

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'))

编辑:

我被要求提供示例数据。因此,请考虑以下设置:

UserU读取三个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

我需要的是这个User:的每个Feed的未读Entries的计数

FeedOne: 3
FeedTwo: 5
FeedThree: 5

试试这个:

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-和其他查询集子句

最新更新