django 1.3: значения и аннотации с внешними ключами и отношениями многие ко многим - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть следующие модели:

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 U читает три Feeds: FeedOne, FeedTwo, FeedThree.

Для каждого Feed в настоящее время в базе данных имеется пять Entries.Два Entries из FeedOne уже прочитаны 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 для каждого Feed изэто User:

FeedOne: 3
FeedTwo: 5
FeedThree: 5

1 Ответ

0 голосов
/ 24 февраля 2012

попробуйте это:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...