0

最初にモデルを提供し、次に説明を書きます。

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)

私が達成したくないことを理解していただければ幸いです。

4

2 に答える 2

0

最後に、私はこの解決策を思いつきました:

categories = Category.objects.filter(user=self.request.user.id).extra(select = {
          "num_not_viewed" : """
          SELECT COUNT(*)
          FROM app_categoryentry
          WHERE app_categoryentry.category_id = app_category.id
          AND app_categoryentry.viewed = %d """ % 0,
        })

このリソースのソリューションに基づいていますhttp://timmyomahony.com/blog/filtering-annotations-django/

Django ORMのみで同じ結果を得る方法が他にある場合は、知りたいです。

于 2015-06-04T08:29:21.157 に答える