Python Django queryset带额外()

Python Django queryset带额外(),python,mysql,sql,django,sqlite,Python,Mysql,Sql,Django,Sqlite,我有四种型号 class Group(models.Model): pass class Item(models.Model): group = ForeignKey(Group) class ItemRevision(models.Model): item = ForeignKey(Item) date = DateField() class ItemRevisionMonth(models.Model): item_revision = Fore

我有四种型号

class Group(models.Model):
    pass

class Item(models.Model):
    group = ForeignKey(Group)

class ItemRevision(models.Model):
    item = ForeignKey(Item)
    date = DateField()

class ItemRevisionMonth(models.Model):
    item_revision = ForeignKey(ItemRevision)
    year = PositiveSmallIntegerField()
    amount = IntegerField()
我试图在Django中创建一个相当复杂的sql查询,所以我认为Django ORM无法处理它

我需要打印所有组,并用金额总和SUMMOUNT注释每个组。除此之外,它应该只选择1个最新添加的项目修订版

我认为它是这样的:

Group.objects.all().extra(select={
    SELECT SUM(amount) FROM app_itemrevisionmonth LEFT JOIN app_itemrevision ON item_revision_id = app_itemrevision.id WHERE item_id = app_item.id AND app_item.group_id = app_group.id
})
SELECT
    SUM(amount)
FROM
    app_itemrevisionmonth
LEFT JOIN
    (
      SELECT
          id
      FROM
          app_itemrevision
      WHERE
          date < %s
      LIMIT
          1
    )
ON
    item_revision_id = app_itemrevision.id
WHERE
    item_id = app_item.id AND
    app_item.group_id = app_group.id
但我不知道如何告诉你,只能从最新版本中选择

编辑1 可能是这样的:

Group.objects.all().extra(select={
    SELECT SUM(amount) FROM app_itemrevisionmonth LEFT JOIN app_itemrevision ON item_revision_id = app_itemrevision.id WHERE item_id = app_item.id AND app_item.group_id = app_group.id
})
SELECT
    SUM(amount)
FROM
    app_itemrevisionmonth
LEFT JOIN
    (
      SELECT
          id
      FROM
          app_itemrevision
      WHERE
          date < %s
      LIMIT
          1
    )
ON
    item_revision_id = app_itemrevision.id
WHERE
    item_id = app_item.id AND
    app_item.group_id = app_group.id
一个项目可能有多个版本,在这种情况下,它应该只使用最新版本,而忽略其他版本。除此之外,还可以在特定日期之前使用修订版。

试试注释

Group.objects.all().annotate(
    sum=models.Sum('item_set__itemrevision_set__itemrevisionmonth_set__amount')
)

详细信息:

我认为它不起作用:WHERE item\u id=app\u item.id,我认为我不能使用注释,因为我希望能够选择不同的修订。我真的需要类似SUMIF的东西:-但是如果我可以选择修订作为ItemRevision.objects.filterdate\u lte=??.latest,它提供了查看特定日期之前的数据的选项。model ItemRevision中没有日期字段。请你重构一个例子好吗?