Django - 来自.values和.annotate的意外结果

时间:2017-05-11 12:54:35

标签: python django django-models django-templates

我试图计算表格中不同产品名称的出现次数。我希望结果是这样的:

Laptop 10
Mice 15

等等,但我得到了:

2 10
1 15

任何想法可能出错?

这是我的 models.py

class ProductNoSerial(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(Category)

    def __str__(self):
        return self.name

class ProductNoSerialInstance(models.Model):
    STATUS_CHOICES = (
      ('in_inventory', 'In Stock'),
      ('given_out', 'Given Out'),
      ('repair', 'Repair')
    )
    name = models.ForeignKey(ProductNoSerial)
    owner = models.ForeignKey(Employee, blank=True, null=True)
    it_dep = models.ForeignKey(ItDep)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='draft')

    def __unicode__(self):
        return self.name

这是我的 view.py

def InventoryList(request):
  count_query = ProductNoSerialInstance.objects.values('name').annotate(count=models.Count('name'))
  context = { 'inventory_list': count_query }
  return render(request, 'inventory_list.html', context)

最后我的 inventory_list.html

<p><b>List of inventory<b></p>
<table>
{% for item in inventory_list %}
<tr>
<td> {{ item.name }} </td>
<td> {{ item.count }} </td>
</tr>
{% endfor %}
</table>

我已经尝试了these suggestions,但没有运气。什么想法可能是错的?我认为这个问题可能是因为name ForeignKey 这个事实?

1 个答案:

答案 0 :(得分:2)

这里有一个微妙的乍一看并不是很明显,因为ProductNoSerialInstance模型有一个名为name的字段,实际上是一个外键。再加上你得到values的事实,这就是结果。 values返回字典而不是对象实例,因此{{ item.name.name }}不幸无法正常工作。您需要对查询稍作修改

ProductNoSerialInstance.objects.values('name__name').annotate(count=models.Count('name'))