我有一个模型,下面有一些字段
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中最低价格相关的?

项目可能有多个项目项目,项目项目可能有多个购置成本.例如,资本项目#1包含两个项目项:
生产设备可能只有一个与购买相关的成本.但是,测试夹具可能具有与构造它相关的多个成本.
我希望能够确定每个项目的总购置成本,并且我希望能够确定每个项目的总购置成本.基于以上示例:
total_acquisition_costs使用Django的聚集来计算或保存为一个DecimalField在Project和ProjectItem模式?我应该total_acquisition_costs为ProjectItem和Project模型创建一个属性吗?创造财产我的直觉是肯定的.
我的直觉是使用聚合来计算值,以避免数据库非规范化.具体来说,我倾向于使用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中有一个查询集,它调用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?
我有一个带created时间戳的Django模型,我想获得每天创建的对象计数.我希望在Django中使用聚合功能,但我无法弄清楚如何用它来解决我的问题.假设这不起作用我总是可以回到刚刚使用values_list获取所有日期,但我更愿意将工作交给Django或DB.你会怎么做?
请帮助我,我已经被困在这个问题上太久了:(
我有这两个模型:
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
我正在使用具有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项目,需要指导.
背景: 我的项目是一个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
我很惊讶这个问题显然还不存在.如果有,请帮我找到它.
我想使用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 的 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
我需要得到两列的聚合值.所以首先将它们组合在一起然后得到它们sum().下面的代码自然不起作用,只是为了澄清.
它是否可能或我应该使用原始SQL?
SomeModel.objects
.filter(**something)
.aggregate(Sum('one_column' * 'another_col'))
Run Code Online (Sandbox Code Playgroud)