복붙노트

[PYTHON] 장고 Rest 프레임 워크 - ModelSerializer에서 사용자 정의 필드를 추가하는 방법

PYTHON

장고 Rest 프레임 워크 - ModelSerializer에서 사용자 정의 필드를 추가하는 방법

ModelSerializer를 만들고 내 모델의 일부가 아닌 사용자 정의 필드를 추가하려고합니다.

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

customField = CharField(source='my_field')

이 필드를 추가하고 validate () 함수를 호출하면이 필드는 attr dict의 일부가 아닙니다. attr은 추가 필드를 제외하고 지정된 모든 모델 필드를 포함합니다. 그래서 내가 덮어 쓰기 검증에서이 필드에 액세스 할 수 없습니까?

이 필드를 다음과 같이 필드 목록에 추가하면 :

class Meta:
    model = Account
    fields = ('myfield1', 'myfield2', 'customField')

customField가 내 모델의 일부가 아니기 때문에 오류가 발생합니다.이 serializer에만 추가하기 때문에 올바른 것입니다.

사용자 정의 필드를 추가 할 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.CharField (및 다른 입력 된 필드)가 쓰기 가능한 필드를위한 경우를 제외하고는 올바른 일을 수행하고 있습니다.

    CharField (및 다른 입력 된 필드)가 쓰기 가능한 필드를위한 경우를 제외하고는 올바른 일을 수행하고 있습니다.

    이 경우 간단한 읽기 전용 필드가 필요하므로 대신 다음을 사용하십시오.

    customField = Field(source='get_absolute_url')
    
  2. ==============================

    2.실제로 모든 모델을 만지지 않고도 해결책이 있습니다. SerializerMethodField를 사용하면 모든 메서드를 serializer에 연결할 수 있습니다.

    실제로 모든 모델을 만지지 않고도 해결책이 있습니다. SerializerMethodField를 사용하면 모든 메서드를 serializer에 연결할 수 있습니다.

    class FooSerializer(ModelSerializer):
        foo = serializers.SerializerMethodField()
    
        def get_foo(self, obj):
            return "Foo id: %i" % obj.pk
    
  3. ==============================

    3.... 모델 메서드가 다음과 같이 정의 된 경우 명확성을 위해 :

    ... 모델 메서드가 다음과 같이 정의 된 경우 명확성을 위해 :

    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')
    

    추신. 맞춤 입력란은 실제로 모델의 입력란이 아니기 때문에 일반적으로 다음과 같이 읽기 전용으로 설정하려고합니다.

    class Meta:
        model = MyModel
        read_only_fields = (
            'model_method_field',
            )
    
  4. ==============================

    4.여기에 귀하의 질문에 대한 답변. 당신은 당신의 모델 계정에 추가해야합니다 :

    여기에 귀하의 질문에 대한 답변. 당신은 당신의 모델 계정에 추가해야합니다 :

    @property
    def my_field(self):
        return None
    

    이제 다음을 사용할 수 있습니다.

    customField = CharField(source='my_field')
    

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

  5. ==============================

    5.self.author.full_name을 표시하기 위해 Field에 오류가 있습니다. ReadOnlyField와 함께 작동했습니다.

    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')
    
  6. ==============================

    6.Django Rest Framework의 마지막 버전에서는 모델에 추가하려는 필드의 이름을 사용하여 메소드를 만들어야합니다.

    Django Rest Framework의 마지막 버전에서는 모델에 추가하려는 필드의 이름을 사용하여 메소드를 만들어야합니다.

    class Foo(models.Model):
        . . .
        def foo(self):
            return 'stuff'
        . . .
    
    class FooSerializer(ModelSerializer):
        foo = serializers.ReadOnlyField()
    
        class Meta:
            model = Foo
            fields = ('foo',)
    
  7. from https://stackoverflow.com/questions/14583816/django-rest-framework-how-to-add-custom-field-in-modelserializer by cc-by-sa and MIT license