我写了一个自定义关系字段
class CustomField(serializers.RelatedField):
def to_representation(self, obj):
print(self.context)
return {
'id': obj.test_id,
'name': obj.test_name,
}
def to_internal_value(self, data):
try:
try:
return self.get_queryset().get(test_id=data)
except KeyError:
raise serializers.ValidationError(
'id is a required field.'
)
except ValueError:
raise serializers.ValidationError(
'id must be an integer.'
)
except:
raise serializers.ValidationError(
'Obj does not exist.'
)
这就是 CustomField 的使用方式
sample_field = CustomField(queryset=SampleModel.objects.all())
如果我想在 CustomField 的 to_representation 和 to_internal_value 函数中传递以后将像 self.var 一样访问的其他参数,我应该怎么做?
我覆盖了该__init__()
函数来设置 to_representation to_internal_value 函数所需的自定义参数。这是它的代码
class CustomField(serializers.RelatedField):
def __init__(self, *args, **kwargs):
id_field = kwargs.pop('id_field', None)
name_field = kwargs.pop('name_field', None)
super(CustomField, self).__init__(*args, **kwargs)
self.id_field = id_field
self.name_field = name_field
def to_representation(self, obj):
print(self.context)
return {
'id': getattr(obj,self.id_field),
'name': getattr(obj,self.name_field),
}
def to_internal_value(self, data):
try:
try:
return self.get_queryset().get(pk=data)
except KeyError:
raise serializers.ValidationError(
'id is a required field.'
)
except ValueError:
raise serializers.ValidationError(
'id must be an integer.'
)
except:
raise serializers.ValidationError(
'Obj does not exist.'
)
我现在可以像这样使用这个 CustomField:
sample_field = CustomField(queryset=SampleModel.objects.all(),id_field="test_id",name_field="test_name")
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句