Django Models

BLAKE KIM·2020년 8월 5일
0

Django Documentation

Models

Model은 데이터에 대해 하나의 결정적인 정보의 근원이다. Model은 본질적인 필드와 저장한 데이터의 정보의 형태를 포함한다. 일반적으로 각각의 모델은 하나의 데이터베이스 table에 매핑된다.

  • 각각의 모델은 django.db.models.Model이라는 Python class의 서브 class이다.
  • 모델의 각각의 속성은 데이터베이스의 field를 표현한다.
  • 이것의 모든 것들을 가지고, Django는 당신에게 자동적으로 생성된 database에 접근하는 API를 제공한다.

Quick example

이 예시 modelfirst_namelast_name을 가진 Person을 정의한다.

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

first_namelast_namemodelfield이다. 각 fieldclass 속성으로 지정된다. 각 속성은 데이터베이스의 column으로 매핑된다.

위의 Person model은 데이터베이스 테이블을 아래와 같이 만들 것이다.

CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);

기술적인 설명을 하자면,

  • 테이블의 이름, myapp_person은 자동적으로 어떤 모델의 메타데이터로부터 파생된다. 그러나 덮어쓸 수 있다.
  • id field는 자동적으로 더해진다. 그러나 이 형태는 덮어쓸 수 있다.

Using models

model을 사용하려고 할 때 Django에 이 model을 사용한다고 알려줘야 한다. settings 파일INSTALLED_APPS에 모듈(앱) 이름을 추가해야 한다. 그 후 model을 사용하기 위해서 manage.py migrate 명령어와 처음 migrations를 만들 때는 manage.py makemigrations 명령어도 사용해야한다.

Fields

model의 가장 중요한 부분은, 그리고 모델의 유일한 필수 부분은 field를 정의하는 데이터베이스의 list이다. Field들은 클래스 속성으로 지정된다. 이 때 models APIfield name과 충돌하지 않도록 잘 선택해야한다. (clean, savedelete와 같은)

Field types

model의 각각의 필드는 적절한 Field class의 객체여야 한다. Django는 몇몇 것들을 결정하기 위해 field class type을 사용한다.

  • 어떤 데이터 타입을 저장하는지 데이터베이스에 말하는 column type이다. (INTEGER, VARCHAR, TEXT)
  • form field를 렌더링할 때 사용하는 HTML 위젯의 기본값이다. (<input type = "text">, <select>)
  • 사용되는 Django admin에서 그리고 자동적으로 생성되는 form에서 최소한의 요구 사항을 확인한다.

Field options

각각의 필드는 어떤 특정 인수를 취한다. 예를 들어 CharFieldmax_length 인수를 요구한다. max_length인수는 데이터를 저장하는데 사용하는 VARCHAR 데이터베이스 필드의 사이즈를 지정한다.

또한 모든 필드 타입에서 보편적인 인수도 가능하다. 모두 선택해서 사용하는 것이다. 많이 쓰이는 것은 다음과 같다.

  • null: True로 설정하면 DjangoNULL 형태로 빈 값을 저장한다. 기본값은 False이다.

  • blank: True로 설정하면 그 필드는 비어 있는 것을 허락한다. 기본값은 False이다. null과 다르다는 점을 알아야 한다. null은 순전히 데이터베이스와 관련된 것인 반면 blank는 검증 관련된 것이다. 만약 필드가 blank=True로 설정된다면 form 검증은 빈 값 입력을 허락한다. 만약 blank=False로 설정된다면 그 필드는 요구될 것이다.

  • choices: 선택 사항으로 사용하기 위한 2개의 튜플 순서. 이 옵션이 주어진다면 기본 양식 위젯은 표전 텍스트 필드 대신 선택 상자가 되고 선택 사항은 주어진 것으로 제한됩니다. 각 튜플의 첫 번째 요소는 데이터베이스에 저장되는 값이다. 두 번째 요소는 필드의 양식 위젯에 의해 표현 되는 값이다. 모델 객체가 주어진다면, 선택사항을 가진 필드의 표현되는 값은 get_FOO_display() 메소드를 사용해서 접근 할 수 있다. 예시는 다음과 같다.

from django.db import models

class Person(models.Model):
    SHIRT_SIZES = (
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)

>>> p = Person(name"Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size		# 'L'
>>> p.get_shirt_size_display()	# 'Large'
  • defalut: 필드의 기본값이다. 값이나 호출 가능한 객체가 될 수 있다. 호출 가능한 객체라면 그것은 부를 때마다 새로운 객체를 생성해서 불러질 것이다.

  • help_text: 양식 위젯과 함께 추가적인 도움말 텍스트가 표시된다. form에 사용되지 않더라도 문서화하는데 유용하다.

  • primary_key: True로 설정하면 그 필드는 그 모델의 주요 키가 된다. 만약 primary_key=True라고 모델의 어느 필드에도 지정하지 않는다면 장고는 자동적으로 primary_key를 가진 IntegerField를 추가한다. 그래서 기본적인 형태를 바꾸길 원하는 것이 아니라면 필드 어느 곳에도 primary_key=True를 주지 않아도 된다. 그 primary_key 필드는 오직 읽을 수만 있다. 만약 존재하는 객체의 primary_key를 바꾸고 저장하게 된다면 기존 객체와 함게 새로운 객체가 생성된다.

from django.db import models

class Fruit(models.Model):
    name = models.CharField(max_length=100, primary_key=True)
>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.objects.values_list('name', flat=True)
<QuerySet ['Apple', 'Pear']>
  • unique: True로 설정된다면 이 필드는 테이블 전체에서 오직 하나여야 한다.

Automatic primary key fields

기본 값으로 Django는 각 모델에 다음 필드를 준다.

id = models.AutoField(primary_key=True)

이 필드는 자동으로 증가되는 primary key이다. 다른 필드에 primary_key=True를 설정해주면 Django가 이것을 보고 id column은 자동적으로 생기지 않는다.

Verbose field names

ForeignKey, ManyToManyField, OneToOneField를 제외한 각각의 필드는 선택적인 첫 번째 위치 인수를 가진다. 그것은 자세한 이름이다. 이것이 주어지지 않는다면 Django는 필드의 속성 이름을 사용하여 자동으로 밑줄을 공백으로 변환하여 생성합니다.

아래 예에서는 verbose name"person's first name"이다.

first_name = models.CharField("person's first name", max_length=30)

아래 예에서는 verbose name"first name"이다.

first_name = models.CharField(max_length=30)

ForeignKey, ManyToManyField, OneToOneField는 첫 번째 인수로 모델 클래스를 요구한다. 그래서 verbose_name을 키워드 인수를 사용한다.

poll = models.ForeignKey(
    Poll,
    on_delete=models.CASCADE,
    verbose_name="the related poll",
)
sites = models.ManyToManyField(Site, verbose_name="list of sites")
place = models.OneToOneField(
    Place,
    on_delete=models.CASCADE,
    verbose_name="related place",
)

이 규칙은 verbose_name의 첫 글자를 대문자로 표기하지 않습니다. Django는 필요한 첫 글자를 자동으로 대문자로 표시합니다.

Relationships

분명히, 관계형 데이터베이스의 힘은 서로 관계가 있는 테이블에 있다. Django는 데이터베이스 관계를 세 가지로 가장 보편적인 타입을 정의할 수 있는 방법을 제공한다.

Many-to-one relationships

many-to-one 관계를 정의하기 위해서는 django.db.models.ForeignKey를 사용한다. 그것을 model의 클래스 속성으로 포함되도록 해서 다른 Field의 타입처럼 사용하면 된다.

ForeignKey는 연결 시킬 모델의 클래스를 위치 인자를 요구한다. 아래 예시를 살펴보자.

from django.db import models

class Manufacturer(models.Model):
    # ...
    pass

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
    # ...

재귀적 관계 또한 만들 수 있다. many-to-one 관계를 가진 객체가 그것 스스로와 관계를 맺을 수 있다.
제안하지만 필수는 아닌데, ForeignKey 필드의 이름은 소문자로 참조하는 모델의 이름으로 한다.

Many-to-many relationships

many-to-many관계를 정의하기 위해서는 ManyToManyField를 사용한다. ManyToManyField는 관계 맺을 모델의 클래스를 위치 인수로 받는다. 예를 들어 Pizza는 많은 Topping 객체들을 같는다. 즉 Topping은 여러 Pizza들을 가지고 각 Pizza들은 여러 Topping들을 가진다. 예는 다음과 같아.

from django.db import models

class Topping(models.Model):
    # ...
    pass

class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)

Extra fields on many-to-many relationships

기본적으로 위와 같은 ManyToMany 관계를 갖는다. 그러나 두 개의 모델 사이에서 관계를 가져야 하는 모델이 필요한 경우가 있을 수 있다. 예시는 다음과 같다.

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

    def __str__(self):
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

One-to-one relationships

One-to-one 관계를 정의하기 위해 OneToOneField를 사용한다. 이것은 Primary_Key의 객체에 가장 유용하다. 객체가 다른 객체로 확장할 때.

Meta options

class Meta를 사용해서 모델의 metadata를 줄수 있다.

from django.db import models

class Ox(models.Model):
    horn_length = models.IntegerField()

    class Meta:
        ordering = ["horn_length"]
        verbose_name_plural = "oxen"

모델 메타데이터는 모든 것이 필드가 아니다. 모델 메타데이터는 ordering option이나 데이터베이스 테이블 이름이나 사람이 읽을 수 있는 하나 그리고 여러 이름들이다. 아무것도 필수적이지 않다. class Meta를 추가하는 것은 선택이다.

Model attributes

objects
가장 중요한 모델의 속성은 Manager이다. Manager는 Django 모델에 데이터베이스 쿼리 작업이 제공되는 인터페이스이며 데이터베이스에서 객체를 검색하는데 사용된다. 직접 만든 Manager가 정의되지 않았다면 기본 이름은 objects이다. Manager는 모델 객체가 아닌 모델 클래스를 통해서만 액세스 할 수 있다.

Model methods

profile
BackEnd

0개의 댓글