代码之家  ›  专栏  ›  技术社区  ›  Stephen

在Django中搜索和计数符合条件的记录

  •  0
  • Stephen  · 技术社区  · 15 年前

    我想在我的应用程序中有一个特定数据库字段的排序列表,例如“年”(在这里我将统计某一年的所有记录,并将总数显示为:2009(10)、2008(3)等),然后单击某一年将显示这些记录。

    我该怎么做?

    编辑1

    class Year(models.Model):
      year = models.PositiveSmallIntegerField()
    
      def __unicode__(self):
         return unicode(self.year)
    
    class CommonVehicle(models.Model):
      year = models.ForeignKey(Year)
      series = models.ForeignKey(Series)
    
      def __unicode__(self):
        name = ''+str(self.year)+" "+str(self.series)
        return name 
    
    class Vehicle(models.Model):
       stock_number = models.CharField(max_length=6, blank=False)
       vin = models.CharField(max_length=17, blank=False)
       common_vehicle = models.ForeignKey(CommonVehicle)
    
       def __unicode__(self):
         return self.stock_number
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Carl Meyer    15 年前

    摘要列表的查询应该如下所示(仅限于Django 1.1+):

    from django.db.models import Count
    Widget.objects.order_by('year').values('year').annotate(count=Count('id'))
    

    这将返回字典列表,如下所示:

    [{'count': 3, 'year': 2006}, {'count': 1, 'year': 2007}, {'count': 2, 'year': 2009}]
    

    您可以在模板中轻松地重复此过程以生成链接列表:

    {% for item in year_counts %}
      <li><a href="{% url year_view year=item.year %}">{{ item.year }} ({{ item.count }})</a></li>
    {% endfor %}
    

    其中,“year_view”是您创建的接受“year”参数并显示筛选后的对象列表的视图,如:

    Widget.objects.filter(year=year)
    
        2
  •  0
  •   thornomad    15 年前

    不确定这是否有帮助,但您可以通过执行以下操作来计算筛选查询中的对象数:

    this_year = Widget.object.filter(you_date_field__year=2009).count()