2

我有一个问题,我无法从.annotate()django 视图中的复杂调用中获得所需的所有信息。这是我的模型:

RECORD_STATUS = (
    (0, "Hidden"),
    (1, "Unhidden"),
    (2, "Deleted"),
)
class Activity(models.Model):
    event_date = models.DateTimeField()
    duration = models.IntegerField(default=0)
    username = models.CharField(max_length=200)
    record_id = models.CharField(max_length=100)
    record_status = models.IntegerField(choices=RECORD_STATUS)
    record_quality = models.FloatField(default=0)

我想根据不同的 record_id 将以下值传递给我的视图模板:

  • 平均质量
  • 数数
  • 最新事件_日期
  • 总持续时间

和...

...最新状态(具有特定记录 ID 的最新 event_date 的活动状态)

使用以下查询集代码块,我已经能够按预期获得其中的大部分,但我无法获取特定record_id. 我倾向于相信一个.extra()电话可能是要走的路,但我似乎无法正确构建它。

record_id_details = Activity.objects.values(
    'record_id',
    ).annotate(
    ave_quality=Avg('record_quality'),
    count=Count('id'),
    latest_event_date=Max('event_date'),
    total_duration=Sum('duration'),
    # Here's where I'm going wrong
    # I need the record_statuses from the most recent Activities of each record_id
    latest_status=,# dont know... record_status WHERE Max(event_date) ???
).order_by(sort)

任何关于注释参数的建议都会给我我需要的东西,或者可能会帮助构建额外的命令。谢谢!

4

2 回答 2

1

没有使用 Django 查询集表达此查询的内置方法。在两个查询中执行它可能是纯粹使用 ORM 的最简单方法。如果您不介意一些原始 SQL,并且您正在使用支持它的数据库,例如 PostgreSQL,您需要的工具称为窗口函数,您可以在此处找到详细信息:http://www.postgresguide .com/tips/window.html

于 2013-03-29T07:09:01.470 回答
0

我将只执行第二个查询,以便我可以将所有这些分开。就像是:

latest = Activity.objects.filter(record_id="whatever_the_record_id_you_want").order_by("-event_date)
most_recent = latest[0]
what_you_asked_for = most_recent.record_status
于 2013-03-29T06:56:21.643 回答