附加到QuerySet项目

时间:2019-01-13 22:39:31

标签: python django django-models django-templates django-views

项目模型(代表产品,例如MacBook)

class Item(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=100)
    manufacturer = models.ForeignKey('Manufacturer', blank=True, null=True, on_delete=models.SET_NULL)
    introduction = models.DateField(auto_now=True)
    is_retired = models.BooleanField(default=False)
    tags = models.ManyToManyField(Tag)

    def __str__(self):
        return self.name

OnHand模型(代表序列化的MacBook)

class OnHand(models.Model):
    name = models.CharField(max_length=100)
    serial = models.CharField(max_length=80)
    asset = models.CharField(max_length=20)
    product = models.ForeignKey(Item, blank=True, null=True, on_delete=models.CASCADE)
    tags = models.ManyToManyField(Tag)

    def __str__(self):
        return self.serial

索引视图 enter image description here

索引功能

def index(request):
    items = Item.objects.all()
    context = {
        'items':items,  
    }
    print(items)
    return render(request, 'index.html', context)

模板/表格

<table class="table table-hover">
  <thead class="thead-light">
    <tr>
      <th>Item Id</th>
      <th>Title</th>
      <th>Manufacturer</th>
      <th>On Hand</th>
      <th>Category Id</th>
    </tr>
  </thead>

  <tbody>
    {% for item in items %}
    <tr>
      <td>{{ item.pk }}</td>
      <td>{{ item.name }}</td>
      <td>{{ item.manufacturer }}</td>
      <td>{{ item.quanity }}</td>
    </tr>

    {% endfor %}
    </tbody>
</table>

此应用程序是一个库存管理系统,可以接收物品(例如MacBook Pro或iPhone 6)和 OnHands ,它们是这些物品的序列化实例。在我的索引功能中,我将all()查询的结果传递给上下文中的索引视图

我可以查询OnHand.objects.filter(product_id=item.pk)来获取每个 Item 的数量,但是,按照我目前的处理方式,我不确定如何将值传递给前端。如果有意义的话,保持关系。

我希望item.quanity本质上代表该特定项目的数量。我在找什么我最初的想法是将其追加到QuerySet上,但是我不确定如何做到这一点。

1 个答案:

答案 0 :(得分:2)

您正在寻找annotate

from django.db.models import Count
items = Item.objects.annotate(
    quantity=Count('onhand_set__id'),
)

根据您的使用情况,您可能需要将distinct=True传递给Count