如何在自定义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
相关产品推荐
相关产品推荐

