我得到了这些模型:
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
的所有读取Entries
的Feeds
:
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
我需要的是这个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-和其他查询集子句