【问题标题】:Advanced model_set.count in Django 1.5Django 1.5 中的高级 model_set.count
【发布时间】:2018-02-20 18:01:41
【问题描述】:

我知道例如object.poll_set.count,但是我如何过滤这些,所以我只得到我 poll_set 的一些对象的计数。我的意思是object.poll_set.filter(pk<20).count。我想我必须在逻辑中而不是在演示中这样做,但是最好的方法是什么?

我还需要找到一些对象的“嵌套计数”。我有三个模型(模型 1、模型 2、模型 3)。模型 3 对模型 2 有一个 FK,模型 2 对模型 1 有一个 FK。在模型 1 中,我可以从模型 2 中获取引用模型 1 的记录数,但我还需要来自模型 3 的记录数引用模型 2 中的任何对象,该对象引用模型 1 中的特定对象。

我在 ListView 中打印模型 1 中的对象。如何获得模型 2 中引用模型 1 中任何对象的记录总数,即我在每个对象中找到的对象总数。我应该在模板中的循环中计算它并在<tfoot> 中打印它吗?

【问题讨论】:

    标签: python django filter count


    【解决方案1】:

    正确的语法是object.poll_set.filter(pk__lt=20).count()。 Django 使用特殊名称来比较值,例如__lte__iexact 等。请参阅https://docs.djangoproject.com/en/1.5/ref/models/querysets/#field-lookups。自从第一个版本以来,这一直在 Django 中。

    不要计入循环,因为您可能有很多不必要的数据库查找。 因此,当您有两个模型:Model1(父)、Model2(子)并且想要查看每个 Model1 以及附加的 Model2 数量时,您可以使用 Model1.objects.filter(whatever).annotate(model2_count=Count('model2'))

    编辑:澄清自定义计数功能应该在哪里

    您的视图可能如下所示:

    views.py

    def model1_list(request):
      objects = Model1.objects.all().annotate(model2_count=Count('model2'))
      return TemplateResponse(request, 'your_template.html', {'objects':objects})
    

    和你的模板“your_template.html”:

    {% for o in objects %}
      <b>{{ o }}</b> - model2s: {{ o.model2_count }} <br/>
    {% endfor %}
    

    【讨论】:

    • 谢谢。 object.poll_set.filter(pk&lt;20).count 我的意思是作为模板标签。我可以在模板引擎中找到与您的示例等效的示例吗?
    • 没有。模板语言在设计上是愚蠢的。对于逻辑,您应该使用您在 python 中编写的视图。
    • 好的。定义此自定义计数函数的最佳方法是什么?模板标签?模型函数?
    猜你喜欢
    • 1970-01-01
    • 2013-11-21
    • 2016-11-06
    • 2013-02-17
    • 2013-01-08
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2015-04-16
    相关资源
    最近更新 更多