标签: django-aggregation

如何在Django中过滤count对注释的对象?

考虑简单的Django模型EventParticipant:

class Event(models.Model):
    title = models.CharField(max_length=100)

class Participant(models.Model):
    event = models.ForeignKey(Event, db_index=True)
    is_paid = models.BooleanField(default=False, db_index=True)
Run Code Online (Sandbox Code Playgroud)

使用参与者总数来注释事件查询很容易:

events = Event.objects.all().annotate(participants=models.Count('participant'))
Run Code Online (Sandbox Code Playgroud)

如何用过滤的参与者数量进行注释is_paid=True

我需要查询所有事件而不管参与者的数量,例如,我不需要按注释结果进行过滤.如果有0参与者,那没关系,我只需要0注释值.

文档中的示例在此处不起作用,因为它从查询中排除对象而不是使用它进行注释0.

更新.Django 1.8具有新的条件表达式功能,所以现在我们可以这样做:

events = Event.objects.all().annotate(paid_participants=models.Sum(
    models.Case(
        models.When(participant__is_paid=True, then=1),
        default=0,
        output_field=models.IntegerField()
    )))
Run Code Online (Sandbox Code Playgroud)

更新2. Django 2.0具有新的条件聚合功能,请参阅下面接受的答案.

python django django-models django-aggregation

109
推荐指数
4
解决办法
4万
查看次数

Django:按日期分组(日,月,年)

我有一个像这样的简单模型:

class Order(models.Model):
    created = model.DateTimeField(auto_now_add=True)
    total = models.IntegerField() # monetary value
Run Code Online (Sandbox Code Playgroud)

我想逐个输出:

  • 一个月有多少销售额(COUNT)
  • 合并值(SUM)

我不确定攻击它的最佳方法是什么.我已经看到了一些相当可怕的额外选择查询,但我简单的想法告诉我,我可能会更好的只是迭代数字,从任意的开始年/月开始计算直到我到达当前月份,抛弃简单查询过滤该月份.更多数据库工作 - 减少开发人员的压

什么对你最有意义?有没有一种很好的方法可以撤回快速的数据表?或者我的脏方法可能是最好的主意?

我正在使用Django 1.3.不确定他们最近是否添加了更好的方式GROUP_BY.

django django-aggregation

78
推荐指数
3
解决办法
4万
查看次数

如何通过AND聚合与Django分组

我有一个相当简单的查询,我想通过ORM,但无法弄清楚..

我有三个型号:

位置(地点),属性(地点可能具有的属性)和评级(还包含分数字段的M2M'到'模型)

我想选择一些重要的属性,并能够按这些属性对我的位置进行排名 - 即所有选定属性的总得分越高=越好.

我可以使用以下SQL来获得我想要的东西:

select location_id, sum(score) 
    from locations_rating 
    where attribute_id in (1,2,3) 
    group by location_id order by sum desc;
Run Code Online (Sandbox Code Playgroud)

返回

 location_id | sum 
-------------+-----
          21 |  12
           3 |  11
Run Code Online (Sandbox Code Playgroud)

我能用ORM得到的最接近的是:

Rating.objects.filter(
    attribute__in=attributes).annotate(
    acount=Count('location')).aggregate(Sum('score'))
Run Code Online (Sandbox Code Playgroud)

哪个回报

{'score__sum': 23}
Run Code Online (Sandbox Code Playgroud)

即所有的总和,不按位置分组.

有什么方法吗?我可以手动执行SQL,但宁可通过ORM来保持一致.

谢谢

django django-aggregation

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

Django order_by()过滤器使用distinct()

我怎么能这样做order_by......

p = Product.objects.filter(vendornumber='403516006')\
                   .order_by('-created').distinct('vendor__name')
Run Code Online (Sandbox Code Playgroud)

问题是我有多个同名的供应商,我只想要供应商的最新产品.

希望有道理吗?

我收到了这个DB错误:

SELECT DISTINCT ON表达式必须匹配初始ORDER BY表达式LINE 1:SELECT DISTINCT ON("search_vendor"."name")"search_product"...

django django-models django-aggregation django-filters

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

Django与GROUP BY相当于COUNT

我知道Django 1.1有一些新的聚合方法.但是我无法弄清楚以下查询的等价物:

SELECT player_type, COUNT(*) FROM players GROUP BY player_type;
Run Code Online (Sandbox Code Playgroud)

是否可以使用Django 1.1的Model Query API,还是应该使用纯SQL?

python sql django django-queryset django-aggregation

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

Django 1.11注释子查询聚合

这是一个前沿的功能,我目前正在解决这个问题并迅速流血.我想在现有的查询集上注释子查询聚合.在1.11之前执行此操作要么意味着自定义SQL,要么锤击数据库.这是这方面的文档,以及它的示例:

from django.db.models import OuterRef, Subquery, Sum
comments = Comment.objects.filter(post=OuterRef('pk')).values('post')
total_comments = comments.annotate(total=Sum('length')).values('total')
Post.objects.filter(length__gt=Subquery(total_comments))
Run Code Online (Sandbox Code Playgroud)

他们在总体上注释,这对我来说似乎很奇怪,但无论如何.

我正在努力解决这个问题,所以我正在把它煮回来,回到我有数据的最简单的现实世界的例子.我有Carparks包含很多Spaces.使用,Book?Author如果这让你更快乐,但是 - 现在 - 我只想使用Subquery*来注释相关模型的计数.

spaces = Space.objects.filter(carpark=OuterRef('pk')).values('carpark')
count_spaces = spaces.annotate(c=Count('*')).values('c')
Carpark.objects.annotate(space_count=Subquery(count_spaces))
Run Code Online (Sandbox Code Playgroud)

这给了我一个可爱的ProgrammingError: more than one row returned by a subquery used as an expression,在我的脑海里,这个错误非常有意义.子查询返回带有注释总计的空格列表.

这个例子表明会发生某种魔法,我最终会得到一个我可以使用的数字.但这不是在这里发生的?如何对聚合子查询数据进行注释?

嗯,有些东西被添加到我的查询的SQL中......

我建造了一个新的停车场/太空模型,它起作用了.所以下一步是弄清楚我的SQL中毒了什么.根据Laurent的建议,我看了一下SQL并尝试使它更像是他们在答案中发布的版本.这就是我发现真正问题的地方:

SELECT "bookings_carpark".*, (SELECT COUNT(U0."id") AS "c"
FROM "bookings_space" U0
WHERE U0."carpark_id" = ("bookings_carpark"."id")
GROUP BY U0."carpark_id", U0."space"
)
AS "space_count" FROM "bookings_carpark"; …
Run Code Online (Sandbox Code Playgroud)

django django-aggregation django-annotate django-subquery

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

在Django Query中使用.extra(select = {...})引入的值上使用.aggregate()?

我试图计算一个玩家每周玩的次数如下:

player.game_objects.extra(
    select={'week': 'WEEK(`games_game`.`date`)'}
).aggregate(count=Count('week'))
Run Code Online (Sandbox Code Playgroud)

但是Django抱怨说

FieldError: Cannot resolve keyword 'week' into field. Choices are: <lists model fields>
Run Code Online (Sandbox Code Playgroud)

我可以在这样的原始SQL中做到这一点

SELECT WEEK(date) as week, COUNT(WEEK(date)) as count FROM games_game
WHERE player_id = 3
GROUP BY week
Run Code Online (Sandbox Code Playgroud)

如果没有在Django中执行原始SQL,有没有一个好方法呢?

python mysql django django-queryset django-aggregation

23
推荐指数
1
解决办法
9175
查看次数

Django - 你可以使用属性作为聚合函数中的字段吗?

我知道答案很简短,因为我试过了.有没有办法实现这一点(即使只是因为黑客攻击)?

class Ticket(models.Model):
    account = modelfields.AccountField()
    uuid = models.CharField(max_length=36, unique=True)
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['created']

    @property
    def repair_cost(self):
        # cost is a @property of LineItem(models.Model)
        return self.lineitem_set.aggregate(models.Sum('cost'))
Run Code Online (Sandbox Code Playgroud)

django django-models django-aggregation

21
推荐指数
2
解决办法
5926
查看次数

Django活动源(Feedly Integration?)

我已经构建了一个简单的Django照片应用程序.用户可以上传照片,关注其他用户和照片.为了处理用户之间的关系(跟随和取消关注),我使用了一个名为django-relations by coleifer的软件包.这是一个很棒的包,使用起来非常简单.

一切都按预期工作.我目前有一个工作活动Feed.

我将Feed分为两部分:跟随(我关注的用户的所有活动)和你(发生在我身上的所有活动).我在我的iOS应用程序下面发布了两张图片,它使用我的Django照片应用程序,因为它是后端:

在此输入图像描述 在此输入图像描述

我想要做的是添加聚合到以下Feed.正如你所看到的,用户alexperri喜欢5次射击.我想将所有这些项目合并为一行.我不需要为"你"提要添加聚合,因为我希望看到每个单独的操作都发生在我身上.但是对于以下Feed,添加聚合是有意义的.有几个应用程序可以很好地进行聚合.Fashionlista,Pinterest和Instagram做得很好.这是一个来自Instagram的例子来展示我想要实现的目标:

在此输入图像描述

在上面的示例中,您可以看到以下Feed,而lovetoronto喜欢5张照片.我开始在播放后使用Instagram来查看它是如何工作的.Instagram关注源显示最多35个活动条目,每个条目最多可包含该活动类型的5个活动."lovetoronto喜欢5张照片"是一个活动条目,它显示了他喜欢的最新5张照片.由于lovetoronto进行了最新的动作,他处于领先地位.

我想实现相同的设置.

这是我目前的模型设置:

models.py

from django.db import models
from django.contrib.auth.models import User

class Photographer(models.Model):
    user = models.OneToOneField(User, primary_key=True
    likes = models.ManyToManyField('Photo', through = 'Likes', 
                                   related_name = 'likedby', blank = True)

class Photo(models.Model):
    photographer = models.ForeignKey(Photographer, related_name = 'shot_owner')
    created = models.DateTimeField(auto_now_add=True)
    url = models.CharField(max_length=128)

class Likes(models.Model):
    liked_at = models.DateTimeField(auto_now_add=True, blank=True, null=True)
    photographer = models.ForeignKey(Photographer, related_name = 'liked_by')
    photo = models.ForeignKey(Photo, null=True)

class Activity(models.Model):
    actor = models.ForeignKey(Photographer, related_name = 'actor')
    receiver = models.ForeignKey(Photographer, related_name …
Run Code Online (Sandbox Code Playgroud)

django feed django-aggregation news-feed tastypie

17
推荐指数
1
解决办法
1395
查看次数

Django GROUP BY strftime日期格式

我想对数据库中的行和按日期分组进行SUM.

我试图使用Django聚合和注释运行此SQL查询:

select strftime('%m/%d/%Y', time_stamp) as the_date, sum(numbers_data)
    from my_model
    group by the_date;
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

data = My_Model.objects.values("strftime('%m/%d/%Y',
           time_stamp)").annotate(Sum("numbers_data")).order_by()
Run Code Online (Sandbox Code Playgroud)

但似乎你只能在values()函数中使用列名; 它不喜欢使用strftime().

我该怎么办呢?

python django orm django-models django-aggregation

14
推荐指数
2
解决办法
8317
查看次数