Model
은 데이터에 대해 하나의 결정적인 정보의 근원이다. Model
은 본질적인 필드와 저장한 데이터의 정보의 형태를 포함한다. 일반적으로 각각의 모델은 하나의 데이터베이스 table
에 매핑된다.
django.db.models.Model
이라는 Python class
의 서브 class
이다.field
를 표현한다.Django
는 당신에게 자동적으로 생성된 database
에 접근하는 API
를 제공한다.이 예시 model
은 first_name
과 last_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_name
과 last_name
은 model
의 field
이다. 각 field
는 class
속성으로 지정된다. 각 속성은 데이터베이스의 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
는 자동적으로 더해진다. 그러나 이 형태는 덮어쓸 수 있다.model
을 사용하려고 할 때 Django
에 이 model
을 사용한다고 알려줘야 한다. settings 파일
의 INSTALLED_APPS
에 모듈(앱) 이름을 추가해야 한다. 그 후 model
을 사용하기 위해서 manage.py migrate
명령어와 처음 migrations
를 만들 때는 manage.py makemigrations
명령어도 사용해야한다.
model
의 가장 중요한 부분은, 그리고 모델의 유일한 필수 부분은 field
를 정의하는 데이터베이스의 list
이다. Field
들은 클래스 속성으로 지정된다. 이 때 models API
와 field name
과 충돌하지 않도록 잘 선택해야한다. (clean
, save
나 delete
와 같은)
model
의 각각의 필드는 적절한 Field class
의 객체여야 한다. Django
는 몇몇 것들을 결정하기 위해 field class type
을 사용한다.
column type
이다. (INTEGER
, VARCHAR
, TEXT
)form field
를 렌더링할 때 사용하는 HTML
위젯의 기본값이다. (<input type = "text">
, <select>
)Django admin
에서 그리고 자동적으로 생성되는 form
에서 최소한의 요구 사항을 확인한다.각각의 필드는 어떤 특정 인수를 취한다. 예를 들어 CharField
는 max_length
인수를 요구한다. max_length
인수는 데이터를 저장하는데 사용하는 VARCHAR 데이터베이스 필드의 사이즈를 지정한다.
또한 모든 필드 타입에서 보편적인 인수도 가능하다. 모두 선택해서 사용하는 것이다. 많이 쓰이는 것은 다음과 같다.
null
: True
로 설정하면 Django
는 NULL
형태로 빈 값을 저장한다. 기본값은 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
로 설정된다면 이 필드는 테이블 전체에서 오직 하나여야 한다.기본 값으로 Django
는 각 모델에 다음 필드를 준다.
id = models.AutoField(primary_key=True)
이 필드는 자동으로 증가되는 primary key
이다. 다른 필드에 primary_key=True
를 설정해주면 Django
가 이것을 보고 id
column
은 자동적으로 생기지 않는다.
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
는 필요한 첫 글자를 자동으로 대문자로 표시합니다.
분명히, 관계형 데이터베이스의 힘은 서로 관계가 있는 테이블에 있다. Django
는 데이터베이스 관계를 세 가지로 가장 보편적인 타입을 정의할 수 있는 방법을 제공한다.
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
관계를 정의하기 위해서는 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)
기본적으로 위와 같은 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
관계를 정의하기 위해 OneToOneField
를 사용한다. 이것은 Primary_Key
의 객체에 가장 유용하다. 객체가 다른 객체로 확장할 때.
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
를 추가하는 것은 선택이다.
objects
가장 중요한 모델의 속성은 Manager
이다. Manager
는 Django 모델에 데이터베이스 쿼리 작업이 제공되는 인터페이스이며 데이터베이스에서 객체를 검색하는데 사용된다. 직접 만든 Manager
가 정의되지 않았다면 기본 이름은 objects
이다. Manager
는 모델 객체가 아닌 모델 클래스를 통해서만 액세스 할 수 있다.