我有这些模型:
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
次读取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
,数据库中当前有五个User
。 FeedOne
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}}
答案 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