首页 > 解决方案 > 如何在 django Rest Framework 中从 view.py 提供 SerializerMethodField 输入

问题描述

我正在使用 Django DRF,并且难以应用 SerializerMethodField ( https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield )

以下是典型模型的简单案例,序列化程序代码,它可以完美运行。

serializer.py(之前)

from django.contrib.auth.models import User
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

view.py(之前)

@api_view(['GET'])
def GetAllUsers(request):
    Users = User.objects.all()
    serializer = UserSerializer(Users, many=True)
    return Response(serializer.data)

为了提供模型中未包含的附加信息,我更改了序列化程序

serializer.py(之后)

from django.contrib.auth.models import User
from django.utils.timezone import now
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    days_since_joined = serializers.SerializerMethodField()

    class Meta:
        model = User

    def get_days_since_joined(self, obj):
        return (now() - obj.date_joined).days

现在我必须找到一种方法将 obj(其中有 date_joined 内部)提供给序列化程序,我想我必须在 view.py 中做到这一点

但我不知道该怎么做。

谢谢

标签: djangodjango-rest-framework

解决方案


您可以像这样将额外的上下文传递给序列化程序

视图.py

@api_view(['GET'])
def GetAllUsers(request):
    Users = User.objects.all()
    context = {"extra_obj": extra_obj}
    serializer = UserSerializer(Users, many=True, context=context)
    return Response(serializer.data)

序列化程序.py

from django.contrib.auth.models import User
from django.utils.timezone import now
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    days_since_joined = serializers.SerializerMethodField()

    class Meta:
        model = User

    def get_days_since_joined(self, obj):
        extra_obj = self.context.get("extra_obj")
        return (now() - extra_obj.date_joined).days

参考这里的官方文档


推荐阅读