[python] Django Rest Framework-ModelSerializer에 사용자 정의 필드를 추가하는 방법

을 (를) 만들고 ModelSerializer내 모델의 일부가 아닌 사용자 정의 필드를 추가하고 싶습니다.

여기 에 추가 필드를 추가하는 설명을 찾았고 다음을 시도했습니다.

customField = CharField(source='my_field')

이 필드를 추가하고 내 validate()함수를 호출 하면이 필드는 attrdict의 일부가 아닙니다 . 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')

출처 : https://stackoverflow.com/a/18396622/3220916


답변

보여주기 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있지만 유효성 검사기를 무시하려는 경우에도 작동합니다 .