最初にモデルを提供し、次に説明を書きます。
class Entry(models.Model):
entry_text = models.TextField()
class Category(models.Model):
user = models.ForeignKey(User)
category_text = models.CharField(max_length=200)
entries = models.ManyToManyField(Entry, through='CategoryEntry')
class CategoryEntry(models.Model):
category = models.ForeignKey(Category)
entry = models.ForeignKey(Entry)
viewed = models.BooleanField(default=False)
だから私はエントリーモデルとカテゴリーモデルを持っていて、ここで説明されているように中間モデルCategoryEntryを作成しましたhttps://docs.djangoproject.com/en/1.7/topics/db/models/#extra-fields-on-many-to- 「閲覧済み」の追加フィールドが 1 つ必要なため (ユーザーが特定のエントリ リンクを初めて開いたときに True とマークされます)。
そこで、ユーザーが自分用に作成したこれらすべてのカテゴリを表示する generic.ListView ビューを作成しました。私が望むのは、すべてのカテゴリ名の横に、エントリの数と、まだ表示されていないエントリの数を表示することです。お気に入り:
Category Total Not_viewed
AAA 126 5
BBB 17 15
テンプレートに合計エントリを表示することができました
{% for category in categories %}
{{ category.text }}
{{ category.entries.count }}
{% endfor %}
私の見解では、 get_queryset のようなものがあります
def get_queryset(self):
categories = Category.objects.filter(user=self.request.user.id)[:]
return categories
私が理解しているように、最善の方法は、get_queryset で表示されたすべてのカテゴリ エントリ数に関するこの追加情報を何とかして追加することです。私は周りを検索しましたが、うまくいくものは何も見つかりませんでした。select_related、prefetch_related、annotate でいくつかのことを試しましたが、これを行う正しい方法がわかりません。それが正しくないことを知っていますが、そのようなことや他のことを試してみてください。
categories = Category.objects.filter(user=self.request.user.id).select_related('categoryentry').filter(categoryentry__viewed=False).count()
categories = Category.objects.filter(user=self.request.user.id).annotate(not_viewed_count=Count('categoryentry')).filter(not_viewed_count__viewed=False)
私が達成したくないことを理解していただければ幸いです。