我有以下型号:
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聚合技术做到这一点....
我找到了这个模块,但在使用之前我想知道是否有本地方法来做到这一点.
这是我的简化模型:
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的查询.如果可能的话我不喜欢使用QuerySet的extra方法来做到这一点.
这就是我到目前为止所尝试的......并且失败了:(
Item.objects.annotate(max_created=Max('trackingpoint__created'),
data=Avg('trackingpoint__data')).filter(trackingpoint__created=F('max_created'))
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在开发一个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) 我正在这样做:
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”
是否有一个函数可以用来查看特定模型实例的所有带注释的字段?
这可能是一个非常愚蠢的问题,但是我如何使用下面的查询来检索 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 仅供参考。
我有一个关于如何按多列的 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)
谢谢。
这是我的模型的简化版本:
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包含出现在他拥有的对象的origin或destination字段中的所有对象的列表Flight,每个对象都用相应数量的Flight对象进行注释。
例如,假设一个用户已经在3个航班:LAX-LHR,LHR-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
我正在尝试获取具有特定字段值的所有相关模型的计数。
这是一些代码...
模型.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查询集.我终于找到了这段非常有用的代码:
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)
它工作正常,但date返回的是一个字符串,而不是一个正确的datetime.date,我不能{{date|date:format}}在模板中使用.似乎原始发件人(Oli)有同样的问题.虽然正在回答的人说它适用于postgres但我没有在SQLite上取得任何成功.
是否可以在查询或模板中将字符串转换为日期时间.或者我是否必须遍历所有条目?
很抱歉在一个单独的趋势中发布,但我没有足够的特权来评论原始的趋势.
我有一个名为的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) 我有一个数据库模型,如下所示.将数据视为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)
编辑:添加说明我正在寻找一种方法来在数据库级别对元素进行分组.
我有一个Model有Model.status字段的模型。该status字段可以是值draft,active或cancelled。
是否可以根据对象的状态获取所有对象的计数?我更愿意在一个查询中做到这一点,而不是这样:
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