【发布时间】:2020-04-06 09:49:23
【问题描述】:
我有两个模型,一个叫做评论,另一个叫做答案,从它的名字可以看出,一个评论有很多答案(正好 7 个),一个经典的一对多关系。
我可以用这种直截了当的关系、过滤、prefech_related 来做所有常见的事情,甚至只预取一些带有条件的答案。
现在,我想用当天的答案对象按审核日期进行分组,如您所见,我的问题是如何做到这一点,因为我将只用一个字段对许多对象进行分组,正常聚合在Django 只是求和,但我想要对象
我为此搜索了一段时间,但找不到可以使用 orm 生成查询集然后序列化它或在 SQL 中完成的解决方案
谢谢
编辑:
用简单的话总结我的问题,我想按字段获取分组的所有对象,例如:如果日期 2019-12-12 有 10 个答案,那么而不是计算或求和的正常注释我想要得到这10个对象
再次感谢您
编辑 2:
这是我的评论模型
class Review(model.Model):
#other fields omitted
submitted_at = models.DateTimeField()
class Meta:
ordering = ('-submitted_at',)
和我的答案模型
class Answer(models.Model):
review = models.ForeignKey(
Review, on_delete=models.CASCADE, related_name='answers')
choice = models.ForeignKey(Choice, on_delete=models.CASCADE)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
class Meta:
ordering = ('id',)
正常输出的样本
[
{
"submitted_at": "2019-10-08T16:13:36.356275+02:00",
"answers": [
{
"question": 1,
"choice": 4
},
{
"question": 2,
"choice": 4
},
{
"question": 3,
"choice": 4
},
{
"question": 4,
"choice": 4
},
{
"question": 5,
"choice": 7
},
{
"question": 6,
"choice": 7
},
{
"question": 7,
"choice": 11
}
],
},
{
"submitted_at": "2019-10-08T16:13:36.234108+02:00",
"answers": [
{
"question": 1,
"choice": 5
},
{
"question": 2,
"choice": 4
},
{
"question": 3,
"choice": 4
},
{
"question": 4,
"choice": 4
},
{
"question": 5,
"choice": 7
},
{
"question": 6,
"choice": 7
},
{
"question": 7,
"choice": 11
}
],
},
{
"submitted_at": "2019-10-08T16:13:36.168304+02:00",
"answers": [
{
"question": 1,
"choice": 1
},
{
"question": 2,
"choice": 1
},
{
"question": 3,
"choice": 1
},
{
"question": 4,
"choice": 1
},
{
"question": 5,
"choice": 8
},
{
"question": 6,
"choice": 8
},
{
"question": 7,
"choice": 10
}
],
}
]
在按提交_at 分组后仅包含日期部分的目标是这样的
[
{
"submitted_at": "2019-10-08",
"answers": [
{
"question": 1,
"choice": 4
},
{
"question": 2,
"choice": 4
},
{
"question": 3,
"choice": 4
},
{
"question": 4,
"choice": 4
},
{
"question": 5,
"choice": 7
},
{
"question": 6,
"choice": 7
},
{
"question": 7,
"choice": 11
},
{
"question": 1,
"choice": 5
},
{
"question": 2,
"choice": 4
},
{
"question": 3,
"choice": 4
},
{
"question": 4,
"choice": 4
},
{
"question": 5,
"choice": 7
},
{
"question": 6,
"choice": 7
},
{
"question": 7,
"choice": 11
},
{
"question": 1,
"choice": 1
},
{
"question": 2,
"choice": 1
},
{
"question": 3,
"choice": 1
},
{
"question": 4,
"choice": 1
},
{
"question": 5,
"choice": 8
},
{
"question": 6,
"choice": 8
},
{
"question": 7,
"choice": 10
}
],
}
]
当然,如果我可以按问题分组会更好,但我认为这可能很难,所以让我们先尝试解决大问题
【问题讨论】:
-
总是添加一些数据和样本输出以获得更快的答案
-
@Fact 如果有帮助,我很乐意从一开始就添加这些内容,但我对此表示怀疑。如果有帮助,我用一句话添加并抽象了我的问题,检查一下
-
为此,取决于数据库,您必须使用分析函数,如 row_number、sum(column) Over()、avg(col) Over()、lead、lag、count(col) over() .同样,如果您可以生成一些数据和预期输出,这将有助于了解您到底想要什么。
-
@Fact 感谢您的帮助,我会尽力提供这些
-
这就是方法,我只是添加了一个答案来帮助您理解我的意思,这可能不是您想要的,但鉴于缺乏明确性,这可能是我最好的猜测t 表的模式和实际数据。
标签: sql django django-models django-rest-framework django-orm