标签: django-aggregation

使用django中的聚合获取最小值字段名称

我有一个模型,下面有一些字段

class Choclate(models.Model):
    name = models.CharField(max_length=256)
    price = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

所以我想获得具有该lowest price 值的字段名称,因此为了获得该lowest price值,我们可以像下面这样使用Aggregations

from django.db.models import Avg, Max, Min

choclates = Choclate.objects.all()
lowest_price = choclates.aggregate(Min('price'))
Run Code Online (Sandbox Code Playgroud)

那么最后如何获得field name与django中最低价格相关的?

python django min django-aggregation

13
推荐指数
1
解决办法
9024
查看次数

在Django模型的属性中使用聚合

架构描述

在此输入图像描述

项目可能有多个项目项目,项目项目可能有多个购置成本.例如,资本项目#1包含两个项目项:

  1. 数量.购买1台生产设备
    • 从供应商处购买设备需要花费5,000美元
  2. 数量.由工作人员构建的1个测试夹具
    • 购买12美元,购买总额为12,000美元.

生产设备可能只有一个与购买相关的成本.但是,测试夹具可能具有与构造它相关的多个成本.

欲望

我希望能够确定每个项目的总购置成本,并且我希望能够确定每个项目的总购置成本.基于以上示例:

  • 第1项总购置费= 5,000美元
  • 第2项总购置成本= 12,000美元
  • 资本项目总购置成本= 17,000美元

问题

  1. 如若total_acquisition_costs使用Django的聚集来计算或保存为一个DecimalFieldProjectProjectItem模式?
  2. 我应该total_acquisition_costsProjectItemProject模型创建一个属性吗?创造财产我的直觉是肯定的.

    我的直觉是使用聚合来计算值,以避免数据库非规范化.具体来说,我倾向于使用Django的聚合Sum函数来创建total_acquisition_costs属性.但是,我并不知道如何将聚合作为属性放在模型上,以便它只返回一个值而不是一个字典.

现行守则

注意:我当前的代码不使用Django的聚合功能,但它可以工作.

class ProjectItem(models.Model):
    project = models.ForeignKey(CapExProject)
    name = models.CharField(max_length=128)

    @property
    def total_acquisition_costs(self):
        acquisition_costs = self.acquisitioncost_set.only(
                'amount')
        total_acquisition_costs = 0
        for acquisition_cost in acquisition_costs:
        total_acquisition_costs += acquisition_cost.amount
        return total_acquisition_costs
Run Code Online (Sandbox Code Playgroud)

django django-models django-aggregation

11
推荐指数
1
解决办法
3990
查看次数

将模板中的外键上的Django值()显示为对象而不是其id

我在Django中有一个查询集,它调用Model.objects.values('item')... where 'item'是一个外键.

class Words(models.Model):
  word = models.CharField()

class Frequency(models.Model):
  word = models.ForeignKey(Words)
  ...
Run Code Online (Sandbox Code Playgroud)

因此,这将返回项ID并在模板中显示为id.如何在模板中显示实际项目值而不是ID?

django django-templates django-aggregation

10
推荐指数
1
解决办法
8320
查看次数

从Django获取每日对象的数量

我有一个带created时间戳的Django模型,我想获得每天创建的对象计数.我希望在Django中使用聚合功能,但我无法弄清楚如何用它来解决我的问题.假设这不起作用我总是可以回到刚刚使用values_list获取所有日期,但我更愿意将工作交给Django或DB.你会怎么做?

django django-aggregation

10
推荐指数
1
解决办法
4074
查看次数

使用子查询来注释计数

请帮助我,我已经被困在这个问题上太久了:(

我想做的事:

我有这两个模型:

class Specialization(models.Model):
    name = models.CharField("name", max_length=64)
class Doctor(models.Model):
    name = models.CharField("name", max_length=128)
    # ...
    specialization = models.ForeignKey(Specialization)
Run Code Online (Sandbox Code Playgroud)

我想用具有该专业的医生数量来注释查询集中的所有专业。

到目前为止我的解决方案:

我经历了一个循环并做了一个简单的: Doctor.objects.filter(specialization=spec).count()然而事实证明这太慢而且效率低下。我读得越多,就越意识到使用此处SubQuery来筛选专业化的医生是有意义的OuterRef。这就是我想出的:

doctors = Doctor.objects.all().filter(specialization=OuterRef("id")) \
    .values("specialization_id") \
    .order_by()
add_doctors_count = doctors.annotate(cnt=Count("specialization_id")).values("cnt")[:1]

spec_qs_with_counts = Specialization.objects.all().annotate(
    num_applicable_doctors=Subquery(add_doctors_count, output_field=IntegerField())
)
Run Code Online (Sandbox Code Playgroud)

对于每个专业,我得到的输出仅为 1。代码只是用它来注释每个医生对象specialization_id,然后注释该组内的计数,这意味着它将是 1。

不幸的是,这对我来说并不完全有意义。在我最初的尝试中,我使用了一个聚合来进行计数,虽然它可以单独工作,但它不能作为 a 工作SubQuery,但我收到此错误:

This queryset contains a reference to an outer query and may only be used in a subquery.

我之前发布过这个问题,有人建议这样做Specialization.objects.annotate(count=Count("doctor"))

然而,这不起作用,因为我需要计算特定的医生查询集。

我已关注这些链接

但是,我没有得到相同的结果:

python django django-aggregation django-annotate django-subquery

10
推荐指数
2
解决办法
2万
查看次数

使用日期时间字段按日分组Django模型条目

我正在使用具有DateTimeField(auto_now_add = True)的类似文章来捕获发布日期(pub_date).这看起来类似于以下内容:

class Article(models.Model):
    text = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

我想做一个查询,计算每天添加多少篇文章帖子或条目.换句话说,我想查询条目并按日分组(最后是月,小时,秒等).这看起来类似于SQLite shell中的以下内容:

select pub_date, count(id) from "myapp_article"
where id = 1
group by strftime("%d", pub_date)
;
Run Code Online (Sandbox Code Playgroud)

返回的内容如下:

2012-03-07 18:08:57.456761|5
2012-03-08 18:08:57.456761|9
2012-03-09 18:08:57.456761|1
Run Code Online (Sandbox Code Playgroud)

我似乎无法弄清楚如何从Django QuerySet获得该结果.我知道如何使用itertools.groupby获得类似的结果,但在这种情况下这是不可能的(下面的解释).

此查询的最终结果将用于显示每天帖子数的图表中.我正在尝试使用Django Chartit包来实现这一目标.Chartit对数据源(DataPool)施加约束.源必须是Model,Manager或QuerySet,因此就我所知,使用itertools.groupby不是一个选项.

所以问题是...... 如何在白天对条目进行分组或聚合,最终得到QuerySet对象?

django django-models django-aggregation

9
推荐指数
1
解决办法
6586
查看次数

注释SUM聚合函数,在Django中导致'None'值

做我的第一个真正的Django项目,需要指导.

背景: 我的项目是一个reddit克隆.用户提交链接+文本.访客upvote或downvote.有一个社交驱动算法,每隔约2分钟作为背景脚本运行,根据净投票和内容的新鲜度重新提交所有提交.相当香草的东西.

问题: 排序votes不正常,因为votes正在初始化None而不是0.这导致None投票的提交排名低于负投票的提交.我已经调试了这个问题好几天 - 没有运气.

细节: 我已经过度使用我的模型的模型管理器来Sum为查询集注释聚合函数,然后通过"社会等级"和投票来对所述查询集进行排序.

下面是我的models.py.我正在使用Django 1.5,因此你在这里看到的一些东西可能与1.8不相符(例如get_query_setvs get_queryset):

class LinkVoteCountManager(models.Manager):
    def get_query_set(self):
        return super(LinkVoteCountManager, self).get_query_set().annotate(votes=Sum('vote__value')).order_by('-rank_score', '-votes') 

class Link(models.Model):
    description = models.TextField(_("Write something"))
    submitter = models.ForeignKey(User)
    submitted_on = models.DateTimeField(auto_now_add=True)
    rank_score = models.FloatField(default=0.0)
    url = models.URLField(_("Link"), max_length=250, blank=True)

    with_votes = LinkVoteCountManager() 
    objects = models.Manager() 

    def __unicode__(self): 
        return self.description

    def set_rank(self):
        # Based on reddit ranking algo at http://amix.dk/blog/post/19588
        epoch …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-queryset django-aggregation

9
推荐指数
2
解决办法
6202
查看次数

Django条件注释

我很惊讶这个问题显然还不存在.如果有,请帮我找到它.

我想使用annotate(Count)和order_by,但我不想计算相关对象的每个实例,只计算满足某个标准的那些实例.

也就是说,我可以根据他们携带的绿椰子的数量来列出燕子:

swallow.objects.annotate(num_coconuts=Count('coconuts_carried__husk__color = "green"').order_by('num_coconuts')
Run Code Online (Sandbox Code Playgroud)

django django-queryset django-aggregation

8
推荐指数
2
解决办法
4412
查看次数

从 Django 的 ArrayAgg 中排除空值

我正在使用 Django 的 postgres 特定ArrayAgg聚合器。它工作正常,但是当列表为空时,我得到[None]而不是[]. 有没有办法过滤掉这些空值?我试图将过滤器参数传递给,ArrayAgg但没有用。这是我的设置的简化示例:

class Image(models.Model):
    # ...

class Reporter(models.Model):
    # ...

class Article(models.Model):
    reporter = models.ForeignKey(Reporter, related_name='articles')
    featured_image = models.ForeignKey(Image, related_name='articles')
    # ...
Run Code Online (Sandbox Code Playgroud)

然后,如果我进行此查询:

reporter = Reporter.objects.annotate(
    article_images=ArrayAgg('articles__featured_image'),
    distinct=True
).first()
Run Code Online (Sandbox Code Playgroud)

结果集中的第一个记者没有任何相关文章,我得到:

> reporter.article_images
[None]
Run Code Online (Sandbox Code Playgroud)

我试图添加一个过滤器,但没有运气:

Reporter.objects.annotate(
    article_images=ArrayAgg(
        'articles__featured_image',
        filter=Q(articles__featured_image__isnull=False)
    )
)
Run Code Online (Sandbox Code Playgroud)

django postgresql django-aggregation django-postgresql django-annotate

8
推荐指数
1
解决办法
3273
查看次数

Django:得到两个相乘列的聚合值

我需要得到两列的聚合值.所以首先将它们组合在一起然后得到它们sum().下面的代码自然不起作用,只是为了澄清.

它是否可能或我应该使用原始SQL?

SomeModel.objects
    .filter(**something)
    .aggregate(Sum('one_column' * 'another_col'))
Run Code Online (Sandbox Code Playgroud)

django django-orm django-aggregation

7
推荐指数
1
解决办法
4511
查看次数