궁금한게 많은 개발자 노트

django 핵심 기능 - Model 본문

Back End

django 핵심 기능 - Model

궁금한게 많은 개발자 2022. 5. 19. 14:58

모델이란 테이블을 정의하는 django의 핵심 클래스를 의미하며 models.py파일에 테이블과 관련된 사항들을 정의

ORM 방식에 기반하여 테이블을 클래스로 정의하고 있어, 클래스의 속성과 메소드를 가질 수 있습니다.

테이블의 column은 모델 클래스의 속성으로 정의하고, 테이블에는 메소드가 없지만 모델 클래스에서는 테이블과 관련된 메소드들을 정의할 수 있습니다.

이렇게 함으로써 테이블에 관련된 데이터와 행위를 모두 모델 클래스 한 곳에서 정의할 수 있는 장점을 가집니다.

 

 

[ 모델 속성 ]

모델의 필드는 모델 클래스의 속성으로 정의되고, 모델 클래스의 속성들은 테이블의 필드로 1:1 매핑

모델 클래스에서 모델 필드는 가장 중요한 속성이며 필수 == 테이블에서 컬럼이 필수인 것과 같은 이치

모델 클래스에서 필드를 정의하기 위해서는 필드명, 필드 타입과 필드 옵션을 항상 정의해줘야 함

필드는 용도에 따라 적절한 타입을 지정해야 하는데, 필드 타입의 역할은 다음과 같다.

1. 테이블의 컬럼 타입을 지정

2. 폼으로 랜더링되는 경우, HTML 위젯을 지정

3. 필드 또는 폼에 대한 유효성 검사 시 최소 기준

 

custom 필드 타입 : Filed abstract class를 상속받아 정의 가능

https://docs.djangoproject.com/ko/4.0/ref/models/fields/

https://docs.djangoproject.com/ko/4.0/howto/custom-model-fields/

 

 

[ 모델 메소드 ]

테이블에는 메소드가 없지만, 모델 클래스에는 메소드를 정의할 수 있습니다. 주의할 점은 클래스 메소드와 객체 메소드를 구분하는 것 입니다.

클래스 메소드는 테이블 레벨에서 동작하는 메소드이고, 객체 메소드는 레코드 레벨에서 동작하는 메소드입니다.

django에서는 클래스 메소드는 사용하지 않고, 객체 메소드만 사용합니다. 즉, 모델 클레스에 정의하는 모델 메소드는 모두 객체 메소드이며, 이 메소드들을 호출하면 테이블 단위가 아니라 레코드 단위에만 영향을 미칩니다.

레코드 : 레코드 Record는 논리적으로 연관된 필드의 집합을 의미하며, 엑셀의 행 row에 해당

 

테이블의 모든 레코드 수를 카운트하는 것처럼, 테이블 레벨의 동작은 별도의 manager 클래스를 내부에 정의하고 manager 클래스의 메소드를 통해서 테이블에 대한 CRUD 동작을 수행합니다.

 

__str__(): 메소드를 통해 객체의 문자열 표현을 반환

get_absolute_url(): 메소드가 정의된 객체를 지칭하는 URL을 반환, URLconf에서 DetailView 제네릭 뷰를 사용하는 경우가 가장 좋은 예입니다. DetailView는 특정 객체에 대한 상세 정보를 보여주는 제네릭 뷰이므로, DetailView와 매핑된 URL을 get_absolute_url메소드를 사용해 구할 수 있기 때문입니다. 항상 정의해주면 좋습니다.

또한, 이 메소드를 정의하면 admin 사이트에서도 해당 객체 수정 화면에는 view on site버튼이 보입니다.

이 메소는 템플릿에서도 자주 사용되는데, URL을 표현하기 위해 하드코딩을 하지 않아도 된다는 장점

 

 

 

[ Meta 내부 클래스 속성 ]

Meta 내부 클래스를 정의해 모델에 대한 메타데이터를 정의할 수 있습니다. django에서는 모델 클래스의 필드는 아니지만 모델 클래스에 필요한 항목을 Meta 내부 클래스에 정의합니다.

즉, 필드는 모델 클래스의 속성으로 필드 이외 항목은 Meta 내부 클래스의 속성으로 정의해, 모델의 필드 속성과 그 외 속성을 구분합니다.

 

ordering : 모델 객체의 리스트 출력 시, 정렬하기 위해 사용하는 필드명을 지정

지정한 필드명을 기준으로 오름차순이 디폴트, -접두사 붙이는 경우 내림차순

ex) ordering = ['-date', 'author'] -> date기준으로 내림차순 정렬 후, author기준 오름차순 정렬

 

db_table : 데이터베이스에 저장되는 테이블 이름을 지정합니다. 지정하지 않으면 디폴트로 앱명_클래스명(소문자)

verbose_name : 사용자가 이해하기 쉬운 모델 객체의 별칭

indexes : database의 B-tree index를 설정

(인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조)

from django.db import models

class Customer(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    class Meta:
        indexes = [
            models.Index(fields=['last_name', 'first_name']),
            models.Index(fields=['first_name'], name='first_name_idx'),
        ]

https://docs.djangoproject.com/en/4.0/ref/models/indexes/

 

 

 

[ Manager 속성 ]

모델 속성과 Meta 내부 클래스 속성을 구분해 모델의 필드는 모두 모델 클래스 속성으로 정의한다고 했지만,

예외적으로 테이블의 컬럼으로 매핑되지 않는 속성이 있는데 Manager 속성입니다.

모든 모델은 반드시 Manager 속성을 가져야 합니다. 명시적으로 지정하지 않으면 디폴트 이름은 objects가 됨

Manager속성은 모델 클래스를 통해서만 액세스 할 수 있고, 모델 객체를 통해서는 액세스 할 수 없습니다.

Manager속성은 models.Manager 타입으로 정의되므로, django의 Manager클래스를 이해하는 것이 중요

Manager클래스를 통해서 데이터베이스의 쿼리가 이루어지기 때문

ex) Album.objects.all() : Album 모델 클래스의 Manager속성명 objects,와 all이라는 Manager클래스 메소드

위 문장은 QuerySet 객체를 반환. (all, filter, exclude, get, count등)

모델 클래스에서는 Manager 속성을 여러 개 정의할 수 있고, 첫번째로 정의된 Manager속성을 default Manager

ex) 특정 filter등을 걸어 테이블 레벨의 쿼리를 진행하기 위해 추가 Manager속성 정의 가능

 

 

'Back End' 카테고리의 다른 글

Fast API  (0) 2022.05.23
django model 간 관계  (0) 2022.05.19
django 개발의 기본 사항  (0) 2022.05.19
토큰 기반 인증 시스템과 JWT  (0) 2022.04.19
인증, 인가와 OAuth란  (0) 2022.04.18
Comments