使用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
相关产品推荐
相关产品推荐

