在 Django REST Framework (DRF) 中正确使用 "callable default function"
Proper usage of "callable default function" in Django REST Framework (DRF)
问题:
如何访问序列化器实例或任何相关参数 在 DRF 字段的 默认可调用函数 中?
场景:
我有一个序列化器配置如下,
<b>def bar_value_callable_function(serializer_instance):
if serializer_instance.context['request'].method == 'GET':
return 'return value One'
return 'return value Two'</b></p>
<p>class FooSerializer(serializers.Serializer):
bar = serializers.CharField(<b>source='foo.bar', default=bar_value_callable_function</b>)</pre>
当我尝试将数据序列化为
serializer = FooSerializer(foo_instance, context={'request': request})
print(serializer.data)
我收到错误消息,
TypeError: bar_value_callable_function() missing 1 required positional argument: 'serializer_instance'
更新
对于DRF>=3.12,使用默认class
这个王
class DefaultBarValue:
requires_context = True
def __call__(self, serializer_instance):
if serializer_instance.context['request'].method == 'GET':
return 'return value One'
return 'return value Two'
将class实例而不是函数传递给default
参数
<b># default callable class
class DefaultBarValue:
"""
"Method `set_context` on defaults is deprecated and will
no longer be called starting with 3.12. Instead set
`requires_context = True` on the class, and accept the
context as an additional argument.
"""
requires_context = True # for DRF>=3.12
serializer_instance = None # not required for DRF>=3.12
def set_context(self, serializer_instance): # not required for DRF>=3.12
self.serializer_instance = serializer_instance
def __call__(self, serializer_instance=None):
if serializer_instance is None: # will be None for older versions of DRF
if self.serializer_instance.context['request'].method == 'GET':
return 'return value One'
return 'return value Two'
else: # for DRF>=3.12
if serializer_instance.context['request'].method == 'GET':
return 'return value One'
return 'return value Two'</b>
# serializer
class FooSerializer(serializers.Serializer):
bar = serializers.CharField(source='foo.bar', <b>default=DefaultBarValue()</b>)
问题:
如何访问序列化器实例或任何相关参数 在 DRF 字段的 默认可调用函数 中?
场景:
我有一个序列化器配置如下,
<b>def bar_value_callable_function(serializer_instance): if serializer_instance.context['request'].method == 'GET': return 'return value One' return 'return value Two'</b></p> <p>class FooSerializer(serializers.Serializer): bar = serializers.CharField(<b>source='foo.bar', default=bar_value_callable_function</b>)</pre>
当我尝试将数据序列化为serializer = FooSerializer(foo_instance, context={'request': request}) print(serializer.data)
我收到错误消息,
TypeError: bar_value_callable_function() missing 1 required positional argument: 'serializer_instance'
更新
对于DRF>=3.12,使用默认class
class DefaultBarValue:
requires_context = True
def __call__(self, serializer_instance):
if serializer_instance.context['request'].method == 'GET':
return 'return value One'
return 'return value Two'
将class实例而不是函数传递给default
参数
<b># default callable class
class DefaultBarValue:
"""
"Method `set_context` on defaults is deprecated and will
no longer be called starting with 3.12. Instead set
`requires_context = True` on the class, and accept the
context as an additional argument.
"""
requires_context = True # for DRF>=3.12
serializer_instance = None # not required for DRF>=3.12
def set_context(self, serializer_instance): # not required for DRF>=3.12
self.serializer_instance = serializer_instance
def __call__(self, serializer_instance=None):
if serializer_instance is None: # will be None for older versions of DRF
if self.serializer_instance.context['request'].method == 'GET':
return 'return value One'
return 'return value Two'
else: # for DRF>=3.12
if serializer_instance.context['request'].method == 'GET':
return 'return value One'
return 'return value Two'</b>
# serializer
class FooSerializer(serializers.Serializer):
bar = serializers.CharField(source='foo.bar', <b>default=DefaultBarValue()</b>)