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中没有日期字段。请你重构一个例子好吗?