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按日期时间字段分为今天,昨天等的主要内容,如果未能解决你的问题,请参考以下文章