0

我正在尝试根据两个用户之间最后一条消息的时间戳对用户配置文件进行排序。

我正在使用 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": ""
}]

但我希望它根据最后一条消息的时间戳进行排序

4

2 回答 2

1

您的响应顺序应在视图中处理。

  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')
于 2020-06-30T12:30:13.650 回答
1

您可以覆盖list以实现此目的:

def list(self, request, *args, **kwargs):
    response = super().list(request, args, kwargs)
    # sort response.data['results']
    return response

此外,lastmessage可以是 adict而不是 a str,因此更容易使用。

于 2020-06-30T12:32:41.683 回答