본문 바로가기
Django/Django개념

models.py 살펴보기

by hyun-am 2020. 11. 18.

models.py 정의

 

model은 테이블을 정의하는 장고의 클래스를 의미합니다.

ORM 방식에 기반해 테이블을 클래스로 정의하고 있어 클래스의 특징인 변수와 메소드를 가질 수 있기 때문입니다.

여기서

ORM이란 객체 관계 매핑(Object-relational Mapping)

의 줄임말로 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법이다. 객체 지향 언어에서 사용할 수 있는 "가상" 객체 데이터베이스를 구축하는 방법이다. 객체 관계 매핑을 가능하게 하는 상용 또는 무료 소프트웨어 패키지들이 있고, 경우에 따라서는 독자적으로 개발하기도한다.

장고 모델이란 테이블을 정의하는 클래스를 의미합니다. 또한 models.py 파일에 테이블 관련 사항을 정의할 수 있습니다.

 

 

model 생성하기

 

model 구조

 

models.py에 있는 모델 클래스의 구조는 아래와 같습니다.

class PartyName(models.Model):
    name = models.CharField('파티 이름', max_length=20)
    place = models.CharField('파티 장소', max_length=50)
    description = models.TextField('파티 설명')
    openday = models.DateTimeField('개최 날짜', default=datetime.now)
    opendate = models.TimeField('개최 시간')
    owner = models.ForeignKey(
        'auth.User', on_delete=models.CASCADE, verbose_name='등록자', blank=True, null=True)

    class Meta:
        ordering = ('name',)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("party:partyname_detail", args=(self.id,))

위에서 부터 하나하나씩 살펴보겠습니다.

 

  1. 모델 클래스 항목
      class PartyName(models.Model):

    이것은 모델 클래스를 정의하는 항목입니다.

  1. 모델 속성
      owner = models.ForeignKey(
      'auth.User', on_delete=models.CASCADE, verbose_name='등록자', blank=True, null=True)
            
    • owner는 필드명을 뜻합니다.
    • models.ForeignKey는 필드 타입을 의미합니다.
    • ('auth.User', on_delete=models.CASCADE, verbose_name='등록자', blank=True, null=True) 이 내용들은 필드 옵션을 뜻합니다.
    • 다양한 모델 속성을 보고 싶으면 다음과 같은 링크에 들어가면 되겠습니다.
  1. 모델 메소드
    • 테이블에는 메소드가 없지만 모델 클래스에서는 메소드를 정의할 수 있습니다. 여기서 주의할 점은 클래스 메소드와 객체 메소드를 구분해야 합니다.
    • (클래스메소드 - 테이블 레벨), (객체 메소드 - 레코드 레벨)
    • 자주쓰는 메소드로는 def __str__()메소드에 의해 객체의 문자열을 표시해주는 것과 제네릭 뷰에서 DetailView와 매핑된 URL을 get_absolute_url() 메소드를 사용해 구현할 수 있습니다.

     

  1. Meta 내부 클래스

     

      class Meta:
          ordering = ['name']
    • Django에서 Meta클래스를 이용하면 내부 클래스 속성을 통해 모델에 대한 메타 데이터를 정의할 수 있습니다.
    • Meta클래스는 필드는 아니지만 모델 클래스에 필요한 항목을 Meta클래스에 정의합니다.
    • 대표적인 내용은 다음과 같은 값들이 있습니다. ordering, db_table, verbose_name, verbose_name_plural등이 있습니다.
    • ordering : 모델 객체의 리스트 출력시 사용합니다. 지정한 필드명을 기준으로 오름차순이고 -를 붙히면 내림차순으로 정렬합니다. 이것은 출력할때 사용하는거지 저장할때 지정하는 것은 아닙니다.
    • db_table : 데이터베이스에 테이블 이름을 지정해 줍니다. 만약에 입력하지 않으면 디폴트로 앱명_클래스명 이런식으로 테이블 명이 지정됩니다. 만약 테이블 명을 지정해 주고 싶으면
          db_table = '장바구니'

      이런식으로 지정하면 되겠습니다.

    • verbose_name : 사용자가 이해하기 쉬운 모델 객체의 별칭 입니다. 마찬가지로 별칭을 사용하고 싶으면 다음처럼 입력하시면 되겠습니다.
          verbose_name = '노래'
    • verbose_name_plural : verbose_name에 대한 복수의 값을 입력합니다. 예를 들면 위에서 '노래'로 지정되면 verbose_name_plural는 '노래들' 이런식으로 설정하면 되겠습니다.

     

  1. Manager 속성
    • 모델 속성 중에서 예외적으로 필드, 즉 테이블의 컬럼으로 매핑되지 않는 속성이 있는데 이것이 바로 Manger입니다.
    • 모든 모델은 반드시 Manager속성을 가져야 합니다. 만일 모델을 정의할 때 명시적으로 지정하지 않으면, Manager 속성의 디폴트 이름은 objects가 됩니다.
    • 만약 Manager클래스를 사용하고 싶으면 다음과 같이 사용할 수 있습니다.

       

          PartyName.objects.all()
      • PartyName은 모델 클래스입니다.
      • objects는 모델 속성명입니다.
      • all()는 클래스의 메소드 입니다.
    • 위에 나와있는 것들은 QuerySet객체를 반환합니다. 따라서 QuerySet클래스의 메소드와 클래스의 메소드는 동일합니다. 따라서 다음과 같은 메소드를 사용할 수 있습니다.
      • all(), filter(), exclude(), get(), count()
    • 사용 예시는 다음과 같습니다.
        class subManager(models.Manager):
            def get_queryset(self):
                return super().get_queryset().filter(owner__username = 'hyunam')
      
        class PartyName(models.Model):
            name = models.CharField('파티 이름', max_length=20)
            place = models.CharField('파티 장소', max_length=50)
            description = models.TextField('파티 설명')
            openday = models.DateTimeField('개최 날짜', default=datetime.now)
            opendate = models.TimeField('개최 시간')
            owner = models.ForeignKey(
                'auth.User', on_delete=models.CASCADE, verbose_name='등록자', blank=True, null=True)
      
            class Meta:
                ordering = ('name',)
      
            def __str__(self):
                return self.name
      
            def get_absolute_url(self):
                return reverse("party:partyname_detail", args=(self.id,))
            objects = models.Manager()
            sub_objects = subManager()
      	
      • 이런식으로 지정하면 PartyName.objects.all()하면 테이블에 있는 모든 파티 이름을 반환하고 PartyName.sub_objects.all()이런식으로 하면 소유자 이름이 현암인 파티네임만 반환 합니다.

       

 

 

Writing custom model fields | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

Model field reference | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

 

객체 관계 매핑 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 객체 관계 매핑(Object-relational mapping; ORM)은 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법이다. 객체 지향

ko.wikipedia.org

 

 

'Django > Django개념' 카테고리의 다른 글

Django Channel Tutorial Part 1  (0) 2021.07.28
왜 Django에서 PostgreSQL을 DB로 사용할까?  (0) 2020.12.01
settings.py 살펴보기  (0) 2020.11.17
Django를 사용하는 이유  (0) 2020.11.17
Django를 이용한 웹 API 만들기  (0) 2020.10.26

댓글