Serializer 및 model 사용법에 대해 (def__str__)

7920 단어 장고
오늘 할 일
· 데이터베이스 정규화 이해
· 모델 : def_str_ (self) 이해

def_str_(self)이란?



우선 결론부터 말하면,def__str__(self)により、管理画面に表示されるモデル内のデータ(レコード)を判別するための、名前(文字列)を定義することができる。
def_str_(self)가 없는 경우, 관리 화면의 표시로부터, 데이터를 판별할 수 없기 때문에, 관리가 어렵다.

models.py에서 def_str_(self) 설정 방법



models.py에서 def_str_(self)를 설정하는 방법에 대한 설명.

models.py 내에서 모델, 느낌을 정의할 수 있다면, 그 모델 내에 다음과 같이 def__str__(self) 를 추가한다.
class GooglePlace(models.Model):
    info = models.JSONField(null=True, blank=True)
    place_id = models.CharField(max_length=1000)
    latitude = models.FloatField()
    longitude = models.FloatField()
    def __str__(self):
        return self.info['name'] if self.info else self.place_id

여기에서는 GooglePlace 모델내에 info, place_id, latitude, longitude 필드가 설정되어 있어 def str(self)내에서는, info 필드를 돌려주도록 하고 있습니다.

info 필드가 없으면 place_id 필드를 반환하도록 설정합니다. (응용)

이 return에서 설정하는 필드 항목이 관리 화면에서 해당 데이터(레코드)를 판별할 수 있도록 표시됩니다.

관리 화면에서 표시



그렇다면 관리 화면에서 어떻게 표시되는지 살펴 보겠습니다.

우선 str(self)가 없는 경우입니다만, 이하와 같이 표시되므로, Post 모델내의 데이터를 판별할 수 없습니다.



다음으로 str(self)를 models.py에 추가한 화면입니다.
아래 화면 표시를 보면, Post 모델의 타이틀 필드가 표시되어, 어느 데이터가 무엇인지 판별이 간단해졌습니다.



이쪽이 단연 보기 쉽네요!

Serializer



Serializer에 Serializer 필드를 넣습니다.

다음으로 공부해 나가는 것은 Serializer에 관한 것입니다.

다음과 같은 Seriaizer가 있는 경우, 리시알라이징된 클래스를 다음과 같이 변수에 저장할 수 있다.
class PostImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = PostImage
        fields = ['id', 'url']


class PostSerializer(serializers.ModelSerializer):
    images = PostImageSerializer(source='postimage_set', many=True)
    class Meta:
        model = Post
        fields = ['id', 'user', 'google_place', 'type', 'permalink', 'message', 'ig_id', 'images']

소스에 정의 된 인수는 필드의 인수로 지정되며 필드에 들어가는 직렬화 된 데이터의 값에 속성을 지정할 수 있습니다.

serializers.SerializerMethodField()



다음에 serializers.SerializerMethodField() 에 대해 배워 간다
이것은 get_xxx가 되고 있는 메소드를 호출하는 필드이다.

예를 들어,
class GooglePlaceSerializer(serializers.ModelSerializer):
    image = serializers.SerializerMethodField()
    class Meta:
        model = GooglePlace
        fields = ['id', 'info', 'place_id', 'latitude', 'longitude','image']

    def get_image(self, obj):
        post_image = PostImage.objects.filter(post__google_place=obj).order_by('-id').first()
        if not post_image:
            return ''
        return post_image.url

Serializer의 필드를 동적으로 결정하고 싶습니다! !
SerializerMethodField 가 있습니다만, 이것은 실제로 동적으로 작성하고 싶은 값을 정의하는 필드입니다. get_{필드 이름}으로 정의된 메서드를 호출합니다. 이들은 모두 출력 전용 속성입니다.
serializers.SerializerMethodField()를 사용하면 메소드 결과에 따라 필드 값을 결정할 수 있습니다.

좋은 웹페이지 즐겨찾기