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 对它们进行分组?
或者,最好请求部门,然后以某种方式用产品数量注释它们?
最佳答案
尽可能避免使用 extra
和 raw
。 aggregation 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/