标签: django-aggregation

Django聚合选择

我有以下型号:

class VotingRound(models.Model):
     pass # here are some unimportant fields

class Vote(models.Model):
     voting_round = models.ForeignKey(VotingRound)
     vote = models.CharField(choices=...)
Run Code Online (Sandbox Code Playgroud)

现在我有VotingRound的实例,我想知道每个值代表了多少次.这很容易通过collections.Counter完成:

>>> Counter(voting_round_instance.vote_set.values_list('vote', flat=True))
Counter({u'decline': 8, u'neutral': 5, u'approve': 4})
Run Code Online (Sandbox Code Playgroud)

现在我想知道是否有办法用Django聚合技术做到这一点....

我找到了这个模块,但在使用之前我想知道是否有本地方法来做到这一点.

django django-aggregation

4
推荐指数
1
解决办法
711
查看次数

Django聚合查询相关的一对多对象

这是我的简化模型:

class Item(models.Model):
    pass

class TrackingPoint(models.Model):
    item = models.ForeignKey(Item)
    created = models.DateField()
    data = models.IntegerField()

    class Meta:
        unique_together = ('item', 'created')
Run Code Online (Sandbox Code Playgroud)

在我的应用程序的许多部分中,我需要检索一组Item并使用data字段TrackingPoint排序的每个项目中的最新字段来注释每个项目created.例如,i1类的实例Item有3个TrackingPoint:

tp1 = TrackingPoint(item=i1, created=date(2010,5,15), data=23)
tp2 = TrackingPoint(item=i1, created=date(2010,5,14), data=21)
tp3 = TrackingPoint(item=i1, created=date(2010,5,12), data=120)
Run Code Online (Sandbox Code Playgroud)

我需要一个查询来检索i1带有tp1.data字段值注释的实例,这tp1是按created字段排序的最新跟踪点.那个查询也应该返回Item没有任何问题TrackingPoint的查询.如果可能的话我不喜欢使用QuerySetextra方法来做到这一点.

这就是我到目前为止所尝试的......并且失败了:(

Item.objects.annotate(max_created=Max('trackingpoint__created'),
                      data=Avg('trackingpoint__data')).filter(trackingpoint__created=F('max_created'))
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

python django orm django-orm django-aggregation

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

如何查询满足谓词的相关记录数的最大值

我正在开发一个Django应用程序,遇到了我想评估的棘手汇总查询。

demo我的项目的应用程序中,我声明了以下用于代表图书馆馆藏的模型类:

from django.db import models

class Book(models.Model):
    interesting = models.BooleanField()

class Library(models.Model):
    books = models.ManyToManyField(Book)
Run Code Online (Sandbox Code Playgroud)

我想查询的是单个图书馆中“有趣”图书的最大数量,这是每个图书馆中“有趣”图书的最大数量。

在SQL中,这是:

select max(a.num_interesting_books) as max
from (select count(demo_book.id) as num_interesting_books
      from demo_book
      inner join demo_library_books on (demo_book.id = demo_library_books.book_id)
      where demo_book.interesting=TRUE
      group by demo_library_books.library_id) as a
Run Code Online (Sandbox Code Playgroud)

 

使用以下测试数据:

insert into demo_library(id) values (1), (2), (3);
insert into demo_book(id, interesting) values
(1, FALSE), (2, FALSE), (3, TRUE),
(4, TRUE), (5, TRUE),
(6, TRUE), (7, TRUE), (8, TRUE), (9, FALSE);
insert into demo_library_books(library_id, book_id) …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-aggregation

3
推荐指数
1
解决办法
1753
查看次数

django 的注释字段存储在模型实例中的什么位置?

我正在这样做:

p = MyModel.objects.filter(user__username="me").annotate(friend_count=Count(friends))
Run Code Online (Sandbox Code Playgroud)

当我看:

p[0]._meta.get_all_field_names()
Run Code Online (Sandbox Code Playgroud)

它返回模型上定义的所有内容,但不返回带注释的字段“friend_count”

是否有一个函数可以用来查看特定模型实例的所有带注释的字段?

django django-models django-aggregation

3
推荐指数
1
解决办法
1146
查看次数

如何在 Django 中检索聚合查询的整数?

这可能是一个非常愚蠢的问题,但是我如何使用下面的查询来检索 Integer?

staravg = UserReview.objects.filter(name__username__iexact=username).aggregate(Avg('stars'))
Run Code Online (Sandbox Code Playgroud)

如果我在模板中执行 {{ staravg }},我会得到 {'stars__avg': 3.33333333333333335}。我知道我可以使用某种模板过滤器检索 3.333,但是必须有一种更简单的方法来检索整数,对吗?星星来自 IntegerField 仅供参考。

django django-queryset django-aggregation

3
推荐指数
1
解决办法
2392
查看次数

Django ORM,多列的总和

我有一个关于如何按多列的 SUM 过滤的问题。

例子:

class Foo(models.Model):
    i1 = models.IntegerField()
    i2 = models.IntegerField()
    i3 = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

我需要过滤 i1、i2、i3 的 SUM 小于 200 的对象。我尝试使用以下方法实现它:

Foo.objects.agregate(i_sum=Sum(i1,i2,i3)).filter(i_sum__lt=200) # error
Foo.objects.agregate(i_sum=Sum([i1,i2,i3])).filter(i_sum__lt=200) # error
Run Code Online (Sandbox Code Playgroud)

谢谢。

django django-orm django-aggregation

3
推荐指数
1
解决办法
6544
查看次数

根据条件使用外键计数注释 Django 查询集

这是我的模型的简化版本:

class Airport(models.Model):
    iata = models.CharField()
    name = models.CharField()
    latitude = models.FloatField()
    longitude = models.FloatField()

class Flight(models.Model):
    origin = models.ForeignKey('Airport', related_name='origins')
    destination = models.ForeignKey('Airport', related_name='destinations')
    owner = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

给定 a User,我想创建一个Airport包含出现在他拥有的对象的origindestination字段中的所有对象的列表Flight,每个对象都用相应数量的Flight对象进行注释。

例如,假设一个用户已经在3个航班:LAX-LHRLHR-CDG,和CDG-JFK。然后我想要一个返回以下对象的查询:

[LHR, id__count=2}, {CDG, id__count=2}, {LAX, id__count=1}, {JFK, id__count=1}]
Run Code Online (Sandbox Code Playgroud)

在上面,三个字母代码代表Airport对象或它们的所有字段。

通常,可能有数千个Users 和数万个Airports 和Flights,所以我正在寻找比使用 for 循环和 if 语句的明显解决方案更有效的方法,最好是在单个数据库查询中。

我目前的进度是这个查询:

Airport.objects.filter(
    Q(origins__owner=user) | Q(destinations__owner=user)
)
.distinct() …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-queryset django-aggregation

3
推荐指数
1
解决办法
2333
查看次数

如何过滤反向外键字段上的 Django 注释

我正在尝试获取具有特定字段值的所有相关模型的计数。

这是一些代码...

模型.py:

class Author(models.Model):
  name = models.CharField(max_length=100)

class Book(models.Model):
  BAD = "BAD"
  MEH = "MEH"
  GOOD = "GOOD"
  GREAT = "GREAT"
  REVIEW_CHOICES = (
    (BAD, BAD.title()),
    (MEH, MEH.title()),
    (GOOD, GOOD.title()),
    (GREAT, GREAT.title()),
  )
  title = models.CharField(max_length=100)
  review = models.CharField(max_length=100, choices=REVIEW_CHOICES)
  author = models.ForeignKey(Author, related_name="books")
Run Code Online (Sandbox Code Playgroud)

假设我想列出每个作者的每种类型评论的数量。

我试过了:

Authors.object.annotate(n_good_books=Count("books")).filter(books__review="GOOD").values("name", "n_good_books")  
Run Code Online (Sandbox Code Playgroud)

我也试过:

Authors.object.annotate(n_good_books=Count("books", filter=Q(books_review="GOOD"))).values("name", "n_good_books")  
Run Code Online (Sandbox Code Playgroud)

但这些都不起作用。

有什么建议?

django django-aggregation

3
推荐指数
1
解决办法
2448
查看次数

在Django中按月分组并检索为datetime.date()

我正在四处寻找如何按月分组django查询集.我终于找到了这段非常有用的代码:

truncate_date = connection.ops.date_trunc_sql('day','timestamp')
qs = qs.extra({'date':truncate_date})
return qs.values('date').annotate(Sum('amount')).order_by('date')
Run Code Online (Sandbox Code Playgroud)

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

它工作正常,但date返回的是一个字符串,而不是一个正确的datetime.date,我不能{{date|date:format}}在模板中使用.似乎原始发件人(Oli)有同样的问题.虽然正在回答的人说它适用于postgres但我没有在SQLite上取得任何成功.

是否可以在查询或模板中将字符串转换为日期时间.或者我是否必须遍历所有条目?

很抱歉在一个单独的趋势中发布,但我没有足够的特权来评论原始的趋势.

python django datetime django-aggregation

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

Django聚合值查询集

我有一个名为的ValuesQuerySet data.

我试图得到每个对象的所有类型的摘要计数

data.values('type') 产生这个输出:

[{'type': u'internal'}, {'type': u'internal'}, {'type': u'external'}, {'type': u'external'}]
Run Code Online (Sandbox Code Playgroud)

我希望得到这样的细分(可以有更多的内部'和'外部'作为选择.这可能有多达20种不同的类型:

internal: 2
external: 2
Run Code Online (Sandbox Code Playgroud)

我正在尝试这个,但它只是返回一个空字典......

data.values('type').aggregate(Count('type'))
Run Code Online (Sandbox Code Playgroud)

Annotate也产生了不受欢迎的结果:

data.values('type').annotate(Count('type'))


[{'type': u'internal', 'type_count': 1}, {'type': u'internal', 'type_count': 1}, {'type': u'external', 'type_count': 1}, {'type': u'external', 'type_count': 1}]
Run Code Online (Sandbox Code Playgroud)

Models.py

class Purchase(models.Model):    

    type = models.ForeignKey(Types)
Run Code Online (Sandbox Code Playgroud)

django django-aggregation

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

Django查询 - 是否可以在数据库级别按公共字段对元素进行分组?

我有一个数据库模型,如下所示.将数据视为2本不同的书籍,每本书都有3个评级.

class Book(models.Model):
    name    = models.CharField(max_length=50)

class Review(models.Model):
    book    = models.ForeignKey(Book)           
    review  = models.CharField(max_length=1000)            
    rating  = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

问题:是否可以使用单个查询对列表中的所有评级进行分组.我希望在数据库级别执行此操作,而无需在代码中迭代Queryset.输出应该类似于:

{
 'book__name':'book1', 
 'rating'    : [3, 4, 4], 
 'average'   : 3.66,
 'book__name':'book2', 
 'rating     : [2, 1, 1] ,
 'average'   : 1.33
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这个查询,但是按照书名分类的评分也不是,平均值也不正确:

Review.objects.annotate(average=Avg('rating')).values('book__name','rating','average')
Run Code Online (Sandbox Code Playgroud)

编辑:添加说明我正在寻找一种方法来在数据库级别对元素进行分组.

django django-models django-queryset django-aggregation

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

Django - 查询每个不同状态的计数

我有一个ModelModel.status字段的模型。该status字段可以是值draftactivecancelled

是否可以根据对象的状态获取所有对象的计数?我更愿意在一个查询中做到这一点,而不是这样:

Model.objects.filter(status='draft').count()
Model.objects.filter(status='active').count()
Model.objects.filter(status='cancelled').count()
Run Code Online (Sandbox Code Playgroud)

我认为这aggregate会有所帮助。

django postgresql django-orm django-queryset django-aggregation

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