Models
03_Fields
- Field types
- Field options
- Automatic primary key fields
- Verbose field names
- Relationships
- Many-to-one relationships
- Many-to-many relationships
- Extra fields on many-to-many relationships
- One-to-one relationships
- Models across files
- Field name restrictions
- Custom field types
field 개요 부분(내용 번역 후 추가 필)
# 작성위치 : models,py
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_stars = models.INtegerField()
01. Field types
우리의 모델 안에 있는 각각의 필드는 적절한 필드 클래스(Field class)의 객체 중 하나가 되어야 합니다. 장고는 필드 클래스의 타입을 아래의 몇가지 사항을 결정하는데 사용합니다.
- 종렬(column)의 타입 : 이것은 데이터베이스에 어떤 종류의 데이터가 저장되는지 알려줍니다. (e.g. INTEGER, VARCHAR, TEXT)
- 기본적인 HTML 위젯(widget)으로 form 필드를 렌더링 할 때 사용합니다. (e.g. ,
- 최소한의 확인이 필요할 때 (장고의 admin과 자동으로 생성되는 form 들을 위해)
장고는 십수개의 built-in field types을 가지고 있습니다. field type의 목록을 전부 확인하고 싶다면 model field reference를 참고하세요. 우리는 쉽게 field를 직접 만들수도 있습니다. Writing custom model fields를 참고하세요.
*VARCHAR = Variable Character Field
02. Field options
필드들은 각각 확실한 필드 특화 인수field-specific arguments 설정을 가집니다. (model field reference 를 참고하세요.) 예를 들어, CharField 는(그리고 이 필드의 하위클래스들은) max_length라는 인수가 필요합니다. 이 인수는 데이터를 저장할 때 사용할 VARCHAR 데이터베이스 필드 크기를 지정해 줍니다.
특정 필드에만 적용되는 인수 설정도 있고, 모든 필드 타입에 들어맞는 일반적인 인수 설정도 있습니다. 모든 것은 우리가 선택하기에 달렸습니다. 이 내용은 reference에 아주 자세하게 설명되어 있습니다. 하지만, 여기서는 가장 자주 사용되는 몇가지만 살펴보고 넘어가겠습니다.
자주 사용되는 필드옵션(인수)
null
null=True라고 필드의 인수를 설정할 때, 장고는 데이터베이스에 NULL로 빈 값을 저장합니다.
blank
blank=True라고 필드의 인수를 설정할 때, 이 필드는 비어있는 것이 가능합니다. 기본적으로는 False로 설정되어 있습니다.
blank가 null과 다르다는 것을 기억하세요. null은 데이터베이스에만 관련되어 있고,
choices
An iterable (e.g., a list or tuple) of 2-tuples to use as choices for this field. 이것이 주어진다면, 위젯의 기본 양식(form)은 기본적인 text 필드가 아니라 select box가 되고, 선택이 주어진 선택지 안에서만 가능하도록 제한됩니다.
choices 리스트는 아래와 같이 생겼습니다.
YEAR_IN_SCHOOL_CHOICES = (
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
('GR', 'Graduate'),
)
위 내용은 다음과 같이 정리할 수 있습니다.
choice 필드 이름 = (
('DB에 저장된 값', '바깥에 드러나는 값'),
)
각 튜플의 첫번째 인수는 데이터베이스에 저장된 값입니다. 두번째 인수는 위젯 또는 ModelChoiceField안에 나타나게됩니다. 주어진 모델의 객체- 즉 choice 필드에 표시되는 값은 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)
위와 같이 작성한 다음, 파이썬 셸에서 get_FOO_display( ) 메서드를 사용해보겠습니다.
>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'
맨 마지막줄의 p.get_shirt_size_display()가 get_FOO_display()를 사용한 부분입니다. FOO는 foobar라고도 하는데, placeholder names를 의미합니다. (metasyntactic variables라고 할 수도 있습니다.)
default
default는 필드를 위한 기본 값입니다. 이것은 값(value)또는 호출가능한 객체(callable object)일 수 있습니다. callable을 사용하면 새로운 객체가 만들어질 때마다 호출됩니다.
help_text
추가적인 "help"문구가 form widget 과 함께 나타나게 됩니다. 우리의 필드가 form을 사용하지 않을 때도 documentation을 위해 유용합니다.
primary_key
primary_key=True로 설정할 경우, 이 필드는 모델의 primary key가 됩니다. 만약 primary_key=True를 따로 설정하지 않는다면, 장고는 자동으로 하나의 IntegerField를 만들어 primary key로 사용합니다. 앞에서 본 id 필드가 바로 이 녀석입니다. 기본적으로 제공되는 primary_key가 맘에 들지 않아 새로 쓰는 경우가 아니면, 굳이 이 필드를 설정할 필요는 없습니다. 더 많은 내용을 원한다면 Automatic primary key fields를 참고하세요.
primary key 필드는 읽는 것만 가능합니다. 만약 우리가 이 필드의 값을 객체가 존재하는 상태에서 변경하고 저장한다면, 새로운 객체는 이전 객체의 안에 만들어집니다. 예를 들어 다음과 같습니다.
from django.db import models
class Fruit(models.Model):
name = models.CharField(max_length=100, primary_key=Ture)
라고 설정한 다음, 파이썬 셸에서 아래와 같이 입력합니다.
>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.obejcts.values_list('name', flat=True)
['Apple', 'Pear']
먼저Fruit class의 name 필드에(이 필드는 위에서 primary_key=True라고 설정해두었습니다.) Apple이란 값을 만듭니다. 그 후 name의 필드값을 변경하고 저장합니다. name 필드를 꺼내보면 값이 새로 형성되지 않고 기존에 있던 Apple의 리스트 안으로 추가된 것을 볼 수 있습니다.
unique
unique=True 라고 설정한다면, 이 필드는 그 테이블 전체에서 특별해 집니다.
다시 한 번 말씀드리지만, 위에서는 대부분의 일반적인 필드 옵션을 짧게 설명했을 뿐입니다. 전체 상세 내용은 common model field option reference 에서 확인하세요.
03. Automatic primary key field
기본적으로, 장고는 각각의 모델에 아래와 같은 필드를 만들어줍니다.
id = models.AutoField(primary_key=True)
id 필드는 자동으로 증가하는 primary key라고 할 수 있습니다.
만약 직접 primary key를 만들고 싶다면 방법은 간단합니다. 우리의 필드 중 하나에 primary_key=True 라고 적어두면 됩니다. 우리가 직접 primary_key=True를 설정하면, 장고는 id 필드를 만들지 않습니다.
모든 모델에는 각각 정확히 하나의 primary_key=True설정을 가진 필드가 필요합니다. 우리가 직접 만든 것이든, 자동으로 추가된 것이든 말입니다.
04. Verbose field names
모든 필드 타입은(ForeignKey, ManyToManyField, OneToOneField 제외) 하나의 선택적인 첫번째 위치인수를 가집니다. 이 선택적 첫번째 위치인수(optional first positional argument)는 verbose name 이라고 부릅니다. 이 verbose name을 우리가 정해주지 않으면, 장고는 자동적으로 언더바를 뺀 필드 속성의 이름을 verbose name으로 인식합니다.
아래 예에서 verbose name은 **person's first name" 으로 설정되었습니다.
first_name= models.CharField("person's first name", max_length=30)
아래 예에서는 verbose name이 따로 설정되지 않았기 때문에, 장고가 필드 이름에서 언더바를 빼고 first name으로 변환하여 verbose name으로 인식합니다.
ForeignKey, ManyToManyField, OneToOneField는 첫번째 인수로 모델 클래스가 필요합니다. 때문에 verbose_name이라는 키워드 인수를 따로 설정해줍니다.
first_name = models.CharField(max_length=30)
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",
)
위 예에서 poll이라는 필드에는 Poll 모델 클래스가 첫번째 인수로 주어졌고, 뒤쪽에 verbose_name이라는 인수를 따로 설정해 주었습니다.
관습적으로 verbose_name의 첫 글자는 대문자로 작성하지 않습니다. 필요한 경우 장고가 알아서 첫 글자를 대문자로 변경해 줍니다.
05. Relationships
관계형 데이터베이스의 강함은 각각의 데이터베이스를 연결하는데서 옵니다. 장고는 세가지의 가장 일반적인 데이터베이스 연결방식을 제공합니다.
(차후 자세한 설명 추가 필)
many-to-one
many-to-many
one-to one
06. Models across files
하나의 모델을 하나의 앱에서 다른 앱으로 연결할 수 있습니다. 이 연결을 위해서, 우리의 모델이 정의된 위치의 파일 가장 위에 연관된 모델을 import해야 합니다. 그리고, 필요한 모델을 언급하세요. 그게 어디있든지 간에 말입니다. 예를 들어, 다음과 같습니다.
from django.db import models
from geography.models import Zipcode
class Restaurant(models.Model):
#...
zip_code = models.ForeignKey(
ZipCode,
on_delete=models.SET_NULL,
blank-True,
null=True,
)
07. Field name restrictions
장고에는 모델의 필드 이름으로 쓸 수 없는 이름 두가지가 있습니다.
- 필드 이름으로 파이썬에 저장된 이름을 사용할 수 없습니다. 파이썬 문법 오류가 발생하기 때문입니다. 예를 들어 다음과 같습니다.
clss Example(models.Model):
pass = models.IntegerField() #'pass' 는 파이썬에 저장되어 있는 이름입니다.
- 필드 이름은 한 줄에 하나 이상의 언더스코어(under bar '_')를 사용할 수 없습니다. 장고의 쿼리가 작동하는 방식 때문입니다. 예를 들어 다음과 같습니다.
class Example(models.Model):
foo__bar = models.IntegerField() # 'foo__bar'가 두개의 언더스코어를 가지고 있습니다!
이 제한 사항은 가끔 제대로 작동할 때도 있습니다. 왜냐하면 우리의 필드 이름이 데이터베이스의 column이름과 일치할 필요는 없기 때문입니다. 이에 관해서는 db_column 문서의 옵션 부분을 참고하세요.
SQL은 단어를 저장합니다. join, where 또는 select와 같은 단어 말입니다. 이 단어들은 모델의 필드 이름으로도 사용할 수 있습니다. 왜냐하면 장고는 모든 데이터베이스 테이블의 이름과 column이름을 모든 SQL 쿼리의 기반에서 제외하기 때문입니다. 이것은 우리의 부분적인 데이터베이스 엔진에서 인용 문법으로 사용됩니다.
08. Custom field types
현재 존재하는 모델 필드들이 우리의 목적에 맞지 않을 수도 있습니다. 또는 조금 일반적이지 않은 데이터베이스 column 양식이 좀 더 발전 된 것을 원할 수도 있습니다. 이럴 때 우리는 우리 만의 필드 클래스를 만들 수 있습니다. 우리가 직접 만드는 필드에 대해서는 Writing custom model fields에서 읽을 수 있습니다.