경로 : topics/db/models

Fields

필드는 모델에서 가장 중요한 부분입니다. 없어서는 안되는 부분이지요. 필드는 그것이 정의한 데이터베이스 필드의 목록이며, 클래스의 속성에 따른 특성을 갖습니다.

필드의 이름을 모델 API와 겹치게 짓지 않도록 조심하세요. claen, save, delete 같은 이름은 모델 API에서 사용되기 때문에 필드의 이름으로 사용해서는 안됩니다.

from django.db import models

class Musician(models.Model):
  first_name = models.CharField(max_length=50)
  last_name = models.CharField(max_length=50)
  instrument = models.CharField(max_length=100)

class Album(models.Model):
  artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
  name = models.CharField(max_length=100)
  release_date = models.DateField()
  num_start = models.IntegerField()

위의 예를 한 번 살펴보겠습니다.

위의 예시 전체는 모델들을 모아놓은 꾸러미(directory)입니다. 관습적으로, 이런 꾸러미는 보통 models라고 불립니다. 이 꾸러미 안에는 Musician과 Album이라는 클래스가 있습니다. 이 각각의 클래스들을 모델이라고 부릅니다.

Musician이라는 모델 안에는 first_name, last_name, instrument라는 변수들이 저장되어 있습니다. 이 변수들을 필드라고 부릅니다. 각각의 변수에 해당하는 값은 데이터 베이스 안에 저장되어 있겠지요. 그렇기 때문에 필드는 그 필드가 정의한 데이터베이스의 목록이라고도 표현됩니다.

예를 들어, 데이터베이스에 '볼프강 아마데우스 모차르트', '루드비히 반 베토벤', '프란츠 페터 슈베르트' 라는 이름이 저장되어 있다고 합시다. Musician 이라는 모델안에서 각각의 데이터들은 first_name, last_name, instrument로 분리되어 구조화 됩니다. Musician 모델의 first_name(이름) 필드는 데이터베이스에서 first_name만 뽑아낸 목록일 것입니다. 즉, '볼프강', '루드비히', '프란츠' 가 되겠습니다.

(앞 부분 누락됨) ManyToManyField.symmetric

ManyToManyFields.symmetric

OneToOne

Models across files

Field name restriction

Custom field types

Meta options

Model attributes

Model methods

Model inheritance

Model attirbutes

모델의 속성 중 가장 중요한 것은 Manager이다. 장고는 object라는 기본 매니저를 만들어주는데... 모델 클래스에 대해 전체적으로 쿼리를 날릴때(?) 커스텀 매니저를 만들면 편리하다. 예를 들어 팔로우 팔로잉을 만들 때 함수를 연도 기준 팔로워라면 릴레이션쉽 인 이어에서 연도를 가지고 연도에 해당하는 릴레이션 목록을 ㄴㄹ턴한다.. 처름. 오브젝트 한쪽에 함수를 만들어서 쓸 수 있다..... (???) 이건 데이터베이스에 쿼리를 날릴 때 쓰는 거고

Model methods

각 인스턴스에서 작동하는 모델 단위 기능을 만들 때 모델 클래스 안 쪽에 만들어준다. 예제에서 프로퍼티는 속성처럼 정의할 수 있는 개념이다.

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    birth_date = models.DateField()

    def baby_boomer_status(self):
        "Returns the person's baby-boomer status."
        import datetime
        if self.birth_date < datetime.date(1945, 8, 1):
            return "Pre-boomer"
        elif self.birth_date < datetime.date(1965, 1, 1):
            return "Baby boomer"
        else:
            return "Post-boomer"

    def _get_full_name(self):
        "Returns the person's full name."
        return '%s %s' % (self.first_name, self.last_name)
    full_name = property(_get_full_name)

위 예제의 가장 마지막 메서드는 property입니다. 모델 인스턴스 레퍼런스는 각 모델에 자동적으로 주어진 메서드의 완벽한 리스트를 가집니다.

Overriding predefined model methods

어떤 글에 댓글이 달렸을 때 메일을 보낸다거나 하는 기능이 가능하다.

데이터베이스 내용 수정시에도 어떤 내요잉 수정되었느닞 확인한 다음... 세이브 안에서 여러 설정이 가능하다.

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def save(self, *args, **kwargs):
        do_something()
        super(Blog, self).save(*args, **kwargs) # Call the "real" save() method.
        do_something_else()

이 경우 세이브의 부모는 클래스 블로그이고, 블로그는 모델즈를 받는다.

Executing custom SQL

안 쓰는 게 좋을 듯. 워닝 세개

Model inheritance

장고의 모델 상속은 파이썬의 노멀 클래스 상속이 작동하는 방식과 거의 동일하다. 하지만 페이지의 시작 부분을 반드시 따라야 한다. 말하자면, 상속의 베이스 클래스가 반드시 django.db.models.Model의 하위 클래스여야 한다.

모델 상속은

*데이터베이스 브라우저에서 확인하고 이미지 추가할 것 상속받은 모델에 ptr 이라는 테이블이 보인다. ... 안 쓰는 게 좋다고 한다.

Model inheritance

- Abstract base classes

<부모 클래스가 추상클래스일 때> 추상클래스 (Abstract base calsses)는 우리가 어떤 일반적인 정보를 여러 개의 다른 모델에 추가하고 싶을 때 유용합니다.
먼저 베이스 클래스를 만들고, 베이스 클래스 내부에 메타클래스를 만듭니다. 거기에 abstract=True 라고 적어서 베이스 클래스를 추상 클래스로 선언합니다.
이 모델(베이스 클래스)은 데이터베이스 테이블을 만들지 않습니다.

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    #  메타를 이용해 추상클래스임을 선언한다
    class Meta:
        abstract = True

# 추상 클래스인 CommonInfo 를 상속하는 자식 클래스
class Student(CommonInfo):
    home_group = models.CharField(max_length=5)

테이블이 따로 생성되는 것을 원하지 않을 때, 자녀들이 자신의 정보를 그대로 가지고 있기를 원할 때 사용한다. 추상 클래스에 있던 속성이 자녀 클래스로 상속되지만, 부모 클래스 자체는 상속되지 않는다. (이 부분 공부할 때, 이게 데이터베이스에 대한 내요이라는 것을 잊지말자. 장고의 모델은 데이터베이스를 관리하는 역할이다.) 물론 추상클래스의 안쪽에 있는 함수는 상속받은 클래스 역시 사용할 수 있다. 필터를 편하게 쓰고 싶다면 부모 클래스를 남겨놓고.. 부모의 단에서 줄 필요가 없을 때 쓴다. 장기 멤버 단기 멤버로 나뉜다면, 상속 클래스 쿼리 뿐 아니라 전체 클래스 쿼릴르 날리고 싶을 때도 있는데...

- Meta inheritance

추상 베이스 클래스를 만들때, 장고는 이 클래스의 모든 메타 클래스가, 우리가 베이스클래스에 정의한 것도 속성으로 상속이 가능하게..

추상 클래스 상속시 추상속성으 ㄴ 빼고 상속을 받고, 같으 속성에 대해서는 한 번 더 선언을 해주면 덮어씌워진다.

Multi-table inheritance

[다중 테이블 상속] 장고가 제공하는 두번째 모델 상속 방식입니다. 각각의 모델이

상속받은 건아이디 값만 가지고 자기 고유값은 따로 가지고 있기.

- Meta and multi-table inheritance
- Inheritance and reverse relations

Proxy models

[프록시 모델 상속]
다중테이블상속을 사용하면 각각의 모델 하위클래스마다 새로운 데이터베이스 테이블이 만들어집니다. 하위클래스가 베이스클래스에 나타나지 않은 부가적인 데이터필드들을 저장할 장소가 필요하기 때문입니다.하지만 우리는 가끔 모델에서 파이썬이 동작하는 방식을 바꾸고 싶을 때가 있습니다. 예를 들어, 기본 매니저를 변경하거나 새로운 메서드를 추가하고 싶을 때 말입니다.

이 경우 우리는 프록시 모델 상속을 사용합니다.

테이블을 생성하지 않는다.

results matching ""

    No results matching ""