You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义Serializer中引入其他模型的字段

解决方案:在FriendshipRequest序列化器中添加用户姓名字段

先根据你提供的图片内容还原核心代码:

1. 原模型代码(django-friendship的FriendshipRequest)

from django.db import models
from django.conf import settings

class FriendshipRequest(models.Model):
    from_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='friendship_requests_sent', on_delete=models.CASCADE)
    to_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='friendship_requests_received', on_delete=models.CASCADE)
    message = models.TextField(blank=True)
    created = models.DateTimeField(auto_now_add=True)
    rejected = models.DateTimeField(null=True, blank=True)
    viewed = models.DateTimeField(null=True, blank=True)

    class Meta:
        unique_together = ('from_user', 'to_user')

2. 原序列化器代码

from rest_framework import serializers
from friendship.models import FriendshipRequest

class FriendshipRequestSerializer(serializers.ModelSerializer):
    class Meta:
        model = FriendshipRequest
        fields = ['id', 'from_user', 'to_user', 'message', 'created', 'rejected', 'viewed']

3. 原视图代码

from rest_framework import viewsets
from friendship.models import FriendshipRequest
from .serializers import FriendshipRequestSerializer

class FriendshipRequestViewSet(viewsets.ModelViewSet):
    queryset = FriendshipRequest.objects.all()
    serializer_class = FriendshipRequestSerializer

方法一:单独添加姓名字段(适合仅需姓名的场景)

通过SerializerMethodField直接提取用户的姓名字段:

from rest_framework import serializers
from friendship.models import FriendshipRequest

class FriendshipRequestSerializer(serializers.ModelSerializer):
    # 发起请求用户的姓名
    from_user_first_name = serializers.SerializerMethodField()
    from_user_last_name = serializers.SerializerMethodField()
    # 接收请求用户的姓名
    to_user_first_name = serializers.SerializerMethodField()
    to_user_last_name = serializers.SerializerMethodField()

    def get_from_user_first_name(self, obj):
        return obj.from_user.first_name
    
    def get_from_user_last_name(self, obj):
        return obj.from_user.last_name
    
    def get_to_user_first_name(self, obj):
        return obj.to_user.first_name
    
    def get_to_user_last_name(self, obj):
        return obj.to_user.last_name

    class Meta:
        model = FriendshipRequest
        fields = ['id', 'from_user', 'to_user', 'from_user_first_name', 'from_user_last_name', 
                  'to_user_first_name', 'to_user_last_name', 'message', 'created', 'rejected', 'viewed']

方法二:嵌套精简用户序列化器(适合后续扩展场景)

如果之后需要更多用户信息,或者希望姓名归类到用户对象下,用嵌套序列化器更规范:

from rest_framework import serializers
from django.contrib.auth import get_user_model
from friendship.models import FriendshipRequest

# 定义仅包含姓名的精简用户序列化器
class MinimalUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = get_user_model()
        fields = ['first_name', 'last_name']

class FriendshipRequestSerializer(serializers.ModelSerializer):
    # 用精简序列化器替换默认外键序列化逻辑
    from_user = MinimalUserSerializer()
    to_user = MinimalUserSerializer()

    class Meta:
        model = FriendshipRequest
        fields = ['id', 'from_user', 'to_user', 'message', 'created', 'rejected', 'viewed']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:15:51