考虑简单的Django模型Event和Participant:
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)
我有一个像这样的简单模型:
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.
我有一个相当简单的查询,我想通过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来保持一致.
谢谢
我怎么能这样做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 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?
这是一个前沿的功能,我目前正在解决这个问题并迅速流血.我想在现有的查询集上注释子查询聚合.在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中毒了什么.根据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) 我试图计算一个玩家每周玩的次数如下:
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,有没有一个好方法呢?
我知道答案很简短,因为我试过了.有没有办法实现这一点(即使只是因为黑客攻击)?
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-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) 我想对数据库中的行和按日期分组进行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().
我该怎么办呢?