python - Django:如何使用过滤的 ForeignKey 字段的计数来注释查询集?

标签 python django django-models

Django新手问题:)

我有以下模型 - 每个评论都是针对一个产品,每个产品都有一个部门:

class Department(models.Model):
    code = models.CharField(max_length=16)
class Product(models.Model):
    id = models.CharField(max_length=40, primary_key=True, db_index=True)
    dept = models.ForeignKey(Department, null=True, blank=True, db_index=True)
class Review(models.Model):
    review_id = models.CharField(max_length=32, primary_key=True, db_index=True) 
    product = models.ForeignKey(Product, db_index=True) 
    time = models.DateTimeField(db_index=True) 

我想对日期范围(2012-01-01 到 2012-01-08)进行 Django 查询,并返回所有部门的列表,并带有部门 ID 以及该部门的产品数量在该日期范围内进行了审查。

这让我有点头疼:)

我可以获得一个时间范围内的所有评论:

 reviews = Review.filter(time__range=["2012-01-01", "2012-01-08"])

那么我猜每个评论都有一个产品字段,每个产品都有一个部门代码。但是如何按产品和代码、计数和部门 ID 对它们进行分组?

或者,最好请求部门,然后以某种方式用产品数量注释它们?

最佳答案

尽可能避免使用 extrarawaggregation docs几乎有这个用例:

直接来自文档:

# Each publisher, each with a count of books as a "num_books" attribute.
>>> from django.db.models import Count
>>> pubs = Publisher.objects.annotate(num_books=Count('book'))
>>> pubs
[<Publisher BaloneyPress>, <Publisher SalamiPress>, ...]
>>> pubs[0].num_books
73

所以,要针对您的特定示例进行修改:

depts = Department.objects.
            filter(product__review__time__range=["2012-01-01", "2012-01-08"]).
            annotate(num_products=Count('product'))

在单独的行中调用函数只是为了便于阅读,您应该相应地移动它们。我没有对此进行测试,但我认为它应该可以工作。

关于python - Django:如何使用过滤的 ForeignKey 字段的计数来注释查询集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11418522/

相关文章:

python - 缓存字符串列表转换为列表

python - Gmail 的 Django 库

django - 为通用 get_context_data 扩展通用 View 类

Django:来自模型实例的字段默认值

python - 删除对象时从媒体中删除图像

python - 如何编写一个高效的__dict__重载函数?

python - 有没有办法在 numpy 上查看某些函数的源代码?

python - 什么是 Python 的 heapq 模块?

python - 在 Django Web 项目中,我的应用程序无法识别

forms - django-rest-framework - 在可浏览的 API 中自动生成表单?