You need to enable JavaScript to run this app. 使用Django-postman与REST API获取用户最新消息的实现问题
优惠活动
大模型
产品
解决方案
定价
更多

使用Django-postman与REST API获取用户最新消息的实现问题

实现方案

1. 修正serializers.py代码

你之前的代码存在两处核心问题:一是SerializerMethodField字段名和对应的取值方法名不匹配,二是单条消息实例obj无法直接调用latest()方法获取全量对话消息,修正后代码如下:

from django.db.models import Q
from rest_framework import serializers
# 导入你项目的Message模型
from .models import Message

class InboxLastMessagesSerializer(serializers.ModelSerializer):
    senderusername = serializers.CharField(source='sender.username', read_only=True)
    reciusername = serializers.CharField(source='recipient.username', read_only=True)
    lastmessage = serializers.SerializerMethodField()

    def get_lastmessage(self, obj):
        current_user = self.context['request'].user
        # 判断当前对话的另一方
        if obj.sender == current_user:
            target_user = obj.recipient
        else:
            target_user = obj.sender
        # 过滤双方所有往来消息,取最新的一条
        latest_msg = Message.objects.filter(
            (Q(sender=current_user) & Q(recipient=target_user)) | 
            (Q(sender=target_user) & Q(recipient=current_user))
        ).order_by('-sent_at').first()
        return {"body": latest_msg.body if latest_msg else ""}

    class Meta:
        model = Message
        fields = ('senderusername', 'reciusername', 'body', 'sent_at', 'lastmessage')

2. 优化views.py查询逻辑

调整查询排序规则,新增预加载逻辑避免重复查询数据库:

from django.db.models import Q
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated
# 导入你项目的认证类、序列化类和Message模型
from .authentication import JSONWebTokenAuthentication
from .serializers import InboxLastMessagesSerializer
from .models import Message

class InboxLastMessagesViewSet(viewsets.ModelViewSet):
    serializer_class = InboxLastMessagesSerializer
    authentication_classes = (JSONWebTokenAuthentication,)
    permission_classes = (IsAuthenticated,)

    def get_queryset(self):
        user = self.request.user
        return Message.objects.filter(
            Q(sender=user) | Q(recipient=user)
        ).select_related('sender', 'recipient').order_by('-sent_at')

调整后返回的结果完全符合你给出的期望输出格式,同一场对话下的所有消息都会返回相同的最新对话内容。

内容的提问来源于stack exchange,提问作者user14098664

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 00:36:04