Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-按参数筛选的与模板相关的类计数中显示_Django_Django Models_Django Select Related - Fatal编程技术网

Django-按参数筛选的与模板相关的类计数中显示

Django-按参数筛选的与模板相关的类计数中显示,django,django-models,django-select-related,Django,Django Models,Django Select Related,我会先给出我的模型,然后写描述 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=

我会先给出我的模型,然后写描述

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,如这里所述,因为我需要一个额外的字段“查看”(当用户第一次打开特定条目链接时标记为True)

所以我创建了generic.ListView视图,其中显示了用户为自己创建的所有类别。我想要的是,在每个类别名称旁边显示,有多少条目,还有多少条目他还没有查看过。 比如:

我已设法通过以下方式显示模板中的总条目

{% for category in categories %}
    {{ category.text }}
    {{ category.entries.count }}
{% endfor %}
在我看来,我已经得到了这样的质疑

def get_queryset(self):
    categories = Category.objects.filter(user=self.request.user.id)[:]

    return categories
据我所知,最好的方法就是在get_queryset中添加关于每个类别的额外信息。我到处找了找,但没有找到任何有用的东西。尝试了一些与选择、预回迁、注释相关的方法,但没有找到正确的方法。 知道这是不对的,但尝试过类似的事情和其他一些事情

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)

希望您能了解我不想实现的目标。

在您的
类别输入模式中,在类别字段中使用相关名称,如下所示:

category = models.ForeignKey(Category, related_name="related_entry_categories")
现在,您可以在查询
类别
模型时使用此相关名称。例如:

from itertools import chain

categories_not_viewed = Category.objects.filter(user=self.request.user.id, related_entry_categories__viewed=False).annotate(num_not_viewed=Count('related_en‌​try_categories'))
categories_viewed = Category.objects.filter(user=self.request.user.id, related_entry_categories__viewed=True).extra(select={'num_not_viewed': 0})
categories = chain(list(categories_not_viewed), list(categories_viewed))

最后,我提出了这个解决方案:

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,
        })
基于此资源的解决方案


如果有人有其他的解决方案,我想知道如何只使用Django ORM获得相同的结果。

Hi!尝试了你的代码,但得到了
异常值:“int”类型的对象没有len()异常位置:/home/user/workspace/env/local/lib/python2.7/site-packages/django/core/paginator.py在第77行的
中,我想你可能不明白我不想得到什么。我想获得一个类别列表,但使用“extra”字段可以保存多少相关条目处于“viewed=False”状态的值。我可以在模板中访问的内容,如
category.category\u text
,但是类似于
category.not\u viewed\u entry\u count
——Django ORM甚至可以这样做吗?你能发布你正在使用的查看代码吗?复制粘贴模型并运行我的建议查询工作。无论如何,如果要为未查看的元素添加计数字段,可以使用annotate。查看此文档页面:我已经查看了聚合页面,尝试了一些方法,但没有了解如何按字段“查看”进行筛选。尝试了
categories=Category.objects.filter(user=self.request.user.id).annotate(num\u not\u viewed=Count('related\u entry\u categories\u viewed=False')
但似乎我不能按“False”进行过滤,只能
…annotate(num\u not\u vieweed=Count('related\u entry\u categories\u vieweed')
但总条目数相同..我的意思是,这个类别有10个条目,用户对其中7个条目“查看=真”,然后我想“num_not_viewed”显示3个(总共10个-已经查看7个)您就快到了。:)您应该使用:
category.objects.filter(user=self.request.user.id,related_entry_categories_viewed=False).annotate(num\u not\u viewsed=Count('related\u entry\u categories\u viewsed'))
。我希望这就是你的意思。
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,
        })