django - 基于 SerializerMethodField 对 django 对象进行排序
问题描述
我正在尝试根据两个用户之间最后一条消息的时间戳对用户配置文件进行排序。
我正在使用 SerializerMethodField 来获取最后一条消息的时间戳。
有什么办法可以对数据进行排序?
class UserProfileSerializer(serializers.ModelSerializer):
lastmessage = serializers.SerializerMethodField()
class Meta:
model = User
fields = ['id','lastmessage']
def get_lastmessage(self,obj):
k = self.context.get('view').kwargs['sid']
data =( Message.objects.filter(receiver=obj.id,sender=k) | Message.objects.filter(sender=obj.id,receiver=k)).order_by('-timestamp').values('message','timestamp')
if len(data) == 0:
return ""
else:
data = data.first()
data["timestamp"] = str(data["timestamp"])
return str(data)
我的观点:
class UserChatViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserProfileSerializer
现在我的观点回归:
[{
"id": 4,
"lastmessage": "{'message': 'random', 'timestamp': '2020-06-14 23:49:33.077749+00:00'}"
},
{
"id": 5,
"lastmessage": ""
},
{
"id": 6,
"lastmessage": "{'message': 'sample', 'timestamp': '2020-06-14 11:53:03.880833+00:00'}"
},
{
"id": 7,
"lastmessage": ""
}]
但我希望它根据最后一条消息的时间戳进行排序
解决方案
您的响应顺序应在视图中处理。
from django.db.models import Subquery, OuterRef
lm = Message.objects.filter(sender=OuterRef("id"), receiver=self.kwargs['sid']).order_by('-timestamp')
data = User.objects.all().annotate(
lastmessage=Subquery(
lm.values('timestamp')[:1]
)
).order_by('-lastmessage__timestamp')
推荐阅读
- dns - dnsmasq 和 cname 记录
- arrays - 创建一个包含整数矩阵的文件。将第一个负元素的行元素替换为具有相同数字的列元素
- java - 如何在春季发送带有查询参数“test[]=test”的请求?
- git - Git克隆和推送不工作但添加提交工作
- mysql - Mysql 表优化以获得更好的性能
- python - 从 json 打印值并忽略键
- arduino - ROSSerial 无法与 ROS Noetic 上的 teensy 设备同步
- drupal - 查看结果中的内容重复
- javascript - 在外部单击时使用 Javascript 设置输入值
- bash - 如何在 bash 文件脚本中调用函数?