Django REST Group按日期时间字段分为今天,昨天等

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django REST Group按日期时间字段分为今天,昨天等相关的知识,希望对你有一定的参考价值。

我有一个与房间相关的模型消息

class Message(models.Model):
    room = models.ForeignKey(Room, on_delete=False, related_name='messages')
    text = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

和我的房间序列化器。

class RoomSerializer(serializers.ModelSerializer):
   messages = MessageSerializer(read_only=True, many=True, allow_null=True)

    class Meta:
        model = Room
        fields = '__all__'

当我得到room/10/我得到所有消息的空间。没关系。但是我需要在今天,昨天和其他时间创建消息group_by等。最佳实践如何。也许它应该在前端完成,因为我只开发API?

示例:现在我明白了

{
"id": 10,
"messages": [{
        "room": 10,
        "text": "Messsage text",
        "created": "2018-03-01T10:15:49.689655Z"
    },
    {
        "room": 10,
        "text": "Messsage text 2",
        "created": "2018-03-02T10:15:49.689655Z"
    }
]

}

我想得到这样的东西

{
"id": 10,
"messages": [{
        "today": [{
            "room": 10,
            "text": "Messsage text",
            "created": "2018-03-01T10:15:49.689655Z"
        }]
    },
    {
        "yesterday": [{
            "room": 10,
            "text": "Messsage text 2",
            "created": "2018-03-02T10:15:49.689655Z"
        }]
    }
]

}

答案

我认为你最好的选择是使用serializers.SerializerMethodField消息:

import datetime
from itertools import groupby

class RoomSerializer(serializers.ModelSerializer):
    messages = serializers.SerializerMethodField()

    class Meta:
        model = Room
        fields = '__all__'

    def get_messages(self, obj):
        messages = obj.messages.all()

        messages_grouped_by_date = groupby(messages.iterator(), lambda m: m.created.date())

        messages_dict = {}

        for date, group_of_messages in messages_grouped_by_date:
            dict_key = date.strftime('%Y-%m-%d')
            if date == datetime.date.today():
                dict_key = 'today'
            elif date == (datetime.date.today() - datetime.timedelta(days=1)):
                dict_key = 'yesterday'

            messages_dict[dict_key] = MessageSerializer(group_of_messages, many=True).data

        return messages_dict

以上是关于Django REST Group按日期时间字段分为今天,昨天等的主要内容,如果未能解决你的问题,请参考以下文章

Django rest框架按日期时间过滤

django-rest-framework 按日期过滤=无

Django 按时间过滤日期时间字段,与日期无关

Django按日期分页(周)

Django GROUP BY strftime 日期格式

如何按 Django-filter 包中的日期字段进行过滤?