[python] Django Rest Framework-ModelSerializer에 사용자 정의 필드를 추가하는 방법
을 (를) 만들고 ModelSerializer
내 모델의 일부가 아닌 사용자 정의 필드를 추가하고 싶습니다.
여기 에 추가 필드를 추가하는 설명을 찾았고 다음을 시도했습니다.
customField = CharField(source='my_field')
이 필드를 추가하고 내 validate()
함수를 호출 하면이 필드는 attr
dict의 일부가 아닙니다 . attr
추가 필드를 제외하고 지정된 모든 모델 필드를 포함합니다. 따라서 덮어 쓴 유효성 검사에서이 필드에 액세스 할 수 없습니다.
이 필드를 다음과 같이 필드 목록에 추가하면 :
class Meta:
model = Account
fields = ('myfield1', 'myfield2', 'customField')
그런 다음 customField
내 모델의 일부 가 아니기 때문에 오류가 발생 합니다.이 직렬 변환기에 대해서만 추가하고 싶기 때문에 올바른 것은 무엇입니까?
사용자 정의 필드를 추가하는 방법이 있습니까?
답변
CharField
(및 기타 입력 된 필드) 쓰기 가능한 필드를 제외하고는 올바른 일을하고 있습니다.
이 경우 간단한 읽기 전용 필드를 원하므로 대신 다음을 사용하십시오.
customField = Field(source='get_absolute_url')
답변
실제로 모델을 전혀 건드리지 않고 해결책이 있습니다. SerializerMethodField
어떤 메소드 든 시리얼 라이저에 연결할 수 있도록 사용할 수 있습니다 .
class FooSerializer(ModelSerializer):
foo = serializers.SerializerMethodField()
def get_foo(self, obj):
return "Foo id: %i" % obj.pk
답변
… 명확성을 위해 다음과 같은 방식으로 정의 된 모델 메서드가있는 경우 :
class MyModel(models.Model):
...
def model_method(self):
return "some_calculated_result"
다음과 같이 serializer에 해당 메서드를 호출 한 결과를 추가 할 수 있습니다.
class MyModelSerializer(serializers.ModelSerializer):
model_method_field = serializers.CharField(source='model_method')
ps 사용자 정의 필드는 실제로 모델의 필드가 아니기 때문에 일반적으로 다음과 같이 읽기 전용으로 만들고 싶을 것입니다.
class Meta:
model = MyModel
read_only_fields = (
'model_method_field',
)
답변
여기에 귀하의 질문에 대한 답변. 모델 계정에 추가해야합니다.
@property
def my_field(self):
return None
이제 다음을 사용할 수 있습니다.
customField = CharField(source='my_field')
답변
보여주기 self.author.full_name
위해 오류가 발생했습니다 Field
. 다음과 함께 작동했습니다 ReadOnlyField
.
class CommentSerializer(serializers.HyperlinkedModelSerializer):
author_name = ReadOnlyField(source="author.full_name")
class Meta:
model = Comment
fields = ('url', 'content', 'author_name', 'author')
답변
Django Rest Framework의 마지막 버전에서는 추가하려는 필드의 이름으로 모델에 메서드를 만들어야합니다.
class Foo(models.Model):
. . .
def foo(self):
return 'stuff'
. . .
class FooSerializer(ModelSerializer):
foo = serializers.ReadOnlyField()
class Meta:
model = Foo
fields = ('foo',)
답변
모델 직렬 변환기에 쓰기 가능한 사용자 정의 필드를 추가하는 솔루션을 찾고있었습니다. 이 질문에 대한 답변에서 다루지 않은이 질문을 찾았습니다.
실제로 간단한 직렬 변환기를 작성해야하는 것 같습니다.
class PassThroughSerializer(serializers.Field):
def to_representation(self, instance):
# This function is for the direction: Instance -> Dict
# If you only need this, use a ReadOnlyField, or SerializerField
return None
def to_internal_value(self, data):
# This function is for the direction: Dict -> Instance
# Here you can manipulate the data if you need to.
return data
이제이 Serializer를 사용하여 ModelSerializer에 사용자 정의 필드를 추가 할 수 있습니다.
class MyModelSerializer(serializers.ModelSerializer)
my_custom_field = PassThroughSerializer()
def create(self, validated_data):
# now the key 'my_custom_field' is available in validated_data
...
return instance
모델에 MyModel
실제로 호출 된 속성이 my_custom_field
있지만 유효성 검사기를 무시하려는 경우에도 작동합니다 .