【问题标题】:Call method once to set multiple fields in Django Rest Framework serializer一次调用方法以在 Django Rest Framework 序列化程序中设置多个字段
【发布时间】:2026-01-25 23:15:01
【问题描述】:

如何使用 Django Rest Framework 序列化程序一次调用相同的方法来设置多个字段?这就是我现在所做的,但这显然两次调用了该方法。如何将其限制为仅调用一次?

class MyModel(models.Model):
    def GetTwoValues(self):
        foo = []
        bar = []

        # expensive operation

        return foo, bar

class MyModelSerializer(serializers.HyperlinkedModelSerializer):
    foo = serializers.SerializerMethodField()
    bar = serializers.SerializerMethodField()

    def get_foo(self, obj):
        foo, _ = obj.GetTwoValues()
        return foo

    def get_bar(self, obj):
        _, bar = obj.GetTwoValues()
        return bar

    class Meta:
        model = MyModel
        fields = ('FirstValue', 'SecondValue',)

【问题讨论】:

    标签: python django optimization django-rest-framework


    【解决方案1】:

    有几个选项:

    1) 存储这些值,以便只调用一次昂贵的方法。例如:

    def _get_two_values(self, obj):
        if not hasattr(self, '_two_values'):
            self._two_values = obj.GetTwoValues()
        return self._two_values
    
    def get_foo(self, obj):
        foo, _ = self._get_two_values(obj)
        return foo
    
    def get_bar(self, obj):
        _, bar = self._get_two_values(obj)
        return bar
    

    2) 从序列化程序中删除这两个字段,并在序列化程序的to_representation 方法中分配这两个值。例如:

    def to_representation(self, obj):
        data = super().to_representation(obj)
        foo, bar = obj.GetTwoValues()
        data['foo'] = foo
        data['bar'] = bar
        return data
    

    【讨论】:

    • 我无法让第一个解决方案工作,我正在使用带有 many=true 的序列化程序,所以看起来缓存的属性将在不同的实例中重用。不过,使用 to_representation 是可行的,而且似乎是一种更好的方法。
    最近更新 更多