[Django] Spring to Django : Model & Serializer

E woo·2024년 7월 4일

Django

목록 보기
2/3
post-thumbnail

Spring 의 Entity 와 DTO 에 해당하는 부분을 Django 에 맞게 바꿔보자!

Model

  • Extension.java
@Data
@Entity
@Table(name = "extensions")
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Extension {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "extension", nullable = false)
    private String extension;

    @Column(name = "type", nullable = false)
    private String type;

    @Column(name = "is_checked", nullable = false)
    private boolean isChecked;

}
  • models.py
class Extension(models.Model):
    id = models.AutoField(primary_key=True)
    extension = models.CharField(null=False)
    type = models.CharField(null=False)
    is_Checked = models.BooleanField(null=False)
    
    def __str__(self):
        return self.extension

위의 Extension 엔티티를 Python 의 모델로 사용하기 위한 코드이다.

str 는 파이썬에서 제공하는 특별 메서드로 객체의 문자열 표현을 사용할 떄 쓴다고 한다.
(스프링에도 @ToString 이 존재한다. 혹은 toString 을 오버라이딩 하는 것으로 사용이 가능!)

이후 데이터베이스와 마이그레이션을 진행하고 이 모델을 바탕으로 ORM 이 가능해진다.

Django와 MySQL 연결하기

pip install mysqlclient
  • settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'flow',
        'USER': 'root',
        'PASSWORD': '1234',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}
python manage.py makemigrations
python manage.py migrate

db 정보 마이그레이션 수행

마이그레이션 에러

위의 에러 발생 시 위의 적어놓은 마이그레이션 명령어들이 제대로 적용되었는지 확인하기
(또한 settings.py 의 INSTALLED_APP 에 생성한 app 이 있어야 인식할 수 있다.)

Serializer

[Django] SerializerMethodField로 모델 필드 값을 변형해서 새로운 필드로 반환하기

Serializer 는 REST API 에서 Json 을 DB 인스턴스로 DB 인스턴스를 Json 으로 만들때 사용하게 된다!
(Spring의 DTO 랑 비슷하다고 볼 수 있다!)

  • Spring DTO
@Getter
@Setter
@Builder
public class ExtensionRequest {
	private String extension;
	private String type;
	private boolean checked;
}

@Getter
@Builder
public class ExtensionResponse {

	private String extension;
    private String type;
    private boolean checked;
    private String result;

}
  • serilzers.py
from rest_framework import serializers
from .models import Extension

class ExtensionRequestSerializer(serializers.ModelSerializer):
    class Meta:
        model = Extension
        fields = ['id', 'extension', 'type', 'is_checked']

class ExtensionResponseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Extension
        fields = ['id', 'extension', 'type', 'is_checked', 'result']

    def get_result(self, obj):
        if obj.checked:
            return f"{obj.extension} 고정 확장자가 활성화 되었습니다."
        else:
            return f"{obj.extension} 고정 확장자가 비활성화 되었습니다."

Meta 에는 Serializer 에 사용할 모델과 메서드를 정의하고 get_ 함수를 통해서는
필드를 커스텀해서 사용할 수 있다.

따라서 위의 get_result 를 정의하는 것만으로도 serializer 를 생성해서 사용할 때 해당 메서드가
자동 호출되어 result 는 주어진 조건문에 맞는 문자열이 들어가게 된다.

(만약 Json 폼이 아닌 HTTP Form 으로 생성하고자 할 경우 Form 을 사용할 수 있다고 한다!)

profile
뒘벼

0개의 댓글