【问题标题】:Get count of related models获取相关模型的数量
【发布时间】:2019-01-12 21:01:38
【问题描述】:

我有 2 个模型,Item 代表一个产品,OnHand 代表每个单独的序列化产品。它们由 product_id 的 ForeignKey 绑定。

物品型号:

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

手把手模型:

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)


    def __str__(self):
        return self.serial

在我的 Index 视图中,我有一个表格,其中显示了这些产品并计算了数量。为此,我需要计算存在匹配 product_idOnHand 对象的数量。

索引:

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

count_onhand:

def count_onhand(items):
        for item in items:
                count = OnHand.objects \
                .filter(product_id=item.product_id) \
                .count()

因为这些将进入相同的视图并且需要维护它们的顺序,所以我认为最好的方向是附加到 Item 查询集,然后附加到我将发送回的列表中原始项目,附加数量。

编辑:我发现上述方法不是一个明智的方法,而是将其留在那里作为上下文。

我想要做的是获取与给定 Item 相关的所有 OnHand 对象的计数。 prefetch_related() 似乎接近我想要的,但似乎只适用于多对多(据我所知)。

我可以使用OnHand.objects.filter(product_id=item.pk).count(),但我不确定这是否是最标准的方法。

【问题讨论】:

  • 我现在正在阅读一篇关于预取的文章,对此有点困惑,但认为这可能是我要找的吗?

标签: python django python-3.x django-models django-views


【解决方案1】:

我想要做的是获取与给定项目相关的所有 OnHand 对象的计数。

只需使用查询 api:

some_item.onhand_set.count()

如果您想计算一组或多个项目:

from django.db.models import Count
items = ( Item
         .objects
         .filter( some condition )
         .annotate(num_onhand=Count('onhand'))
         )

更多示例请访问django Aggregation docs

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2013-02-17
    • 2014-12-05
    • 2016-05-26
    • 2012-05-07
    相关资源
    最近更新 更多