json - 如何在查询集中按日期分组
问题描述
我需要帮助在 Django View 中编写正确的查询集。我有(字段)的Post
模型。我想按日期分组并以特定格式返回。created_at
datetime
models.py
class Post(TrackableDate):
title = models.CharField(max_length=255)
body = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
views.py
class PostViewSet(mixins.ListModelMixin,
viewsets.GenericViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
serializers.py
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = '__all__'
通常的响应如下所示:
[
{
"id": 1,
"text": "ok",
"created_at": "2012-12-12T12:30:00"
},
{
"id": 2,
"text": "ok",
"created_at": "2012-12-12T12:30:00"
},
{
"id": 3,
"text": "ok",
"created_at": "2012-12-13T12:30:00"
}
]
如何分组和返回?
{
"2012-12-12": [
{
"id": 1,
"text": "ok",
"created_at": "2012-12-12T12:30:00"
},
{
"id": 2,
"text": "ok",
"created_at": "2012-12-12T12:30:00"
}
],
"2012-12-13": [
{
"id": 3,
"text": "ok",
"created_at": "2012-12-13T12:30:00"
}
]
}
我试着做
Post.objects.extra(select={'created_at': 'date(created_at)'}).values('created_at').annotate(available=Count('created_at'))
但它返回
<QuerySet [{'created_at': '2020-07-04', 'available': 7}, {'created_at': '2020-07-09', 'available': 2}]>
解决方案
这是一个辅助函数,你可以像这样完成你的结果,它可能是一个更好的解决方案。这是我想出的
def group_by_date(mydata):
new_data = {}
for element in mydata:
v = element['created_at'].split('T')[0]
if v not in new_data.keys():
new_data[v] = []
new_data[v].append(element)
return new_data
您可以覆盖 API 的 get 函数并重新处理输出
并覆盖return Response(group_by_date(serializer.data), HTTP_200_OK)
推荐阅读
- angular - VS Code 修复库的导入路径
- messagekit - 官方示例中消息左对齐和右对齐的条件在哪里?
- python - 用 python 和 Pandas 重塑多个变量
- python - 如何按回车键换行?
- visual-studio-code - 如何使用扩展定义并且不允许以与多个验证器兼容的方式附加属性(JSON 模式草案 7)?
- pandas - 在 Pandas 中分割一个系列
- c# - CS8804:如果存在具有顶级语句的编译单元,则无法指定 /main
- uml - 这个图可以代表一个迭代/集合中的每个吗?序列图还是活动图?
- c++ - Qt6 桌面应用程序和使用 cmake 的共享库
- flutter - 如何在颤动中悬停时更改 TextField?