django 1.3:使用外键和多对多关系进行值和注释

时间:2012-02-23 21:52:53

标签: django django-models many-to-many

我有这些模型:

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集。

现在我遇到了以下问题:如果每UserEntries次读取Feed,我怎样才能获得User个未读Feed的数量?

来自Feeds方面,以下语句将我Entries的所有User排除在给定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和计数分组在一起:

Feeds

修改

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

Feed你读了三个Entries:FeedOne,FeedTwo,FeedThree。

对于每个Entries,数据库中当前有五个UserFeedOne EntryA (read by U) EntryB (read by U) EntryC EntryD EntryE FeedTwo EntryF EntryG EntryH EntryI EntryJ FeedThree EntryK EntryL EntryM EntryN EntryO U已经读取了两个Entries FeedOne。

要点:

Feed

我需要的是此User的每个FeedOne: 3 FeedTwo: 5 FeedThree: 5 的未读{{1}}计数:

{{1}}

1 个答案:

答案 0 :(得分: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