Django의 모델
모델은 ORM의 핵심입니다. 모델은 애플리케이션에서 사용할 일부 데이터를 표현하는 것입니다. 이는 사용자, 제품, 카테고리 또는 애플리케이션에 필요한 다른 형태의 데이터일 수 있습니다.
모델 만들기
Django에서 모델은 django.models.Model
의 기능 컬렉션을 상속하는 모든 클래스입니다. 컬렉션에는 데이터베이스를 쿼리하고, 새 항목을 만들고, 업데이트를 저장하는 데 사용할 수 있는 메서드가 포함되어 있습니다. 또한 필드를 정의하고, 메타데이터를 설정하고, 모델 간의 관계를 설정할 수 있습니다.
Product
및 Category
두 모델을 만들려면 다음과 같은 두 개의 클래스를 추가합니다.
from django.db import models
class Product(models.Model):
# details would go here
pass
class Category(models.Model):
# details would go here
pass
메서드 추가하기
모델에 관한 데이터를 구성하는 방법에 관해 설명하기 전에 모델이 Python 클래스임을 강조하는 것이 중요합니다. 따라서 메소드를 추가하고 Django.models.Model
이 제공하는 메소드 또는 모든 Python 객체에 고유한 메소드를 재정의할 수 있습니다.
특히 강조 표시하는 방법 중 하나는 __str__
입니다. 필드가 지정되지 않은 경우 이 메서드를 사용하여 개체를 표시합니다. Product
에 name
필드가 있는 경우(잠시 후 표시됨) __str__
을 재정의하여 Product
의 기본 문자열 표현으로 반환할 수 있습니다.
class Product(models.Model):
name = models.TextField()
def __str__(self):
return self.name
필드 추가하기
필드는 모델의 데이터 구조를 정의합니다. 필드에는 항목 이름, 만든 날짜, 가격 또는 모델에 저장해야 하는 다른 데이터 조각이 포함될 수 있습니다.
데이터의 서로 다른 데이터 형식, 유효성 검사 규칙 및 다른 형식의 메타데이터를 사용할 수 있습니다. Django ORM에는 모델의 필드를 사양에 맞게 구성하는 다양한 옵션 도구 모음이 포함되어 있습니다. ORM은 확장이 가능하므로 필요에 따라 사용자 고유의 규칙을 만들 수 있습니다.
필드 형식 정의
모든 필드에 관한 메타데이터의 핵심 부분은 문자열 또는 숫자와 같이 저장할 데이터의 형식입니다. 필드 형식은 데이터베이스 형식과 HTML 양식 컨트롤 형식(예:텍스트 상자 또는 확인란)으로 매핑됩니다. Django에 포함된 여러 필드 형식은 다음과 같습니다.
CharField
: 한 줄의 텍스트.TextField
: 여러 줄의 텍스트.BooleanField
: 부울 true/false 옵션.DateField
: 날짜.TimeField
: 시간.DateTimeField
: 날짜 및 시간.URLField
: URL.IntegerField
: 정수.DecimalField
: 전체 자릿수가 고정된 10진수.
Product
및 Category
클래스에 필드를 추가하기 위해 다음 코드를 사용할 수 있습니다.
from django.db import models
class Product(models.Model):
name = models.TextField()
price = models.DecimalField()
creation_date = models.DateField()
class Category(models.Model):
name = models.TextField()
필드 옵션
필드 옵션을 사용하여 Null 값 또는 빈 값을 허용하는 메타데이터를 추가하거나 필드를 고유하게 표시할 수 있습니다. 유효성 검사 옵션을 설정하고 유효성 검사 오류에 관한 사용자 지정 메시지를 제공할 수도 있습니다.
필드 형식과 마찬가지로 필드 옵션도 데이터베이스의 적절한 설정에 매핑됩니다. 규칙은 Django에서 자동으로 생성하는 모든 형식에 적용됩니다.
필드 옵션은 필드 자체의 함수에 전달됩니다. 다른 필드는 다른 옵션을 지원할 수 있습니다. 가장 일반적인 옵션은 다음과 같습니다.
null
- Null 값을 허용하는 부울 옵션입니다.
- 기본값은
False
입니다.
blank
- 빈 값을 허용하는 부울 옵션입니다.
- 기본값은
False
입니다.
default
- 필드의 값이 제공되지 않은 경우 기본값을 구성할 수 있습니다.
- 기본값을
null
데이터베이스로 설정하려면default
를None
으로 설정하세요.
unique
- 이 필드에는 숫자 값이 포함되어야 합니다.
- 기본값은
False
입니다.
min_length
및max_length
- 최소 및 최대 문자열 길이를 식별하기 위해 문자열 형식과 함께 사용됩니다.
- 기본값은
None
입니다.
min_value
및max_value
- 최솟값 및 최댓값을 식별하기 위해 숫자 형식과 함께 사용됩니다.
auto_now
와auto_now_add
을 참조하세요.- 현재 시간을 사용해야 하는지 여부를 나타내기 위해 날짜/시간 형식과 함께 사용됩니다.
auto_now
는 항상 필드를 저장할 때 현재 시간으로 설정하므로 이는last_update
필드에 유용합니다.auto_now_add
은 필드를 현재 작성 시간으로 설정하므로 이는creation_date
필드에 유용합니다.
참고
null
및 blank
값은 비슷해 보일 수 있지만 데이터베이스 용어에서 다른 항목을 의미합니다. null
은 값이 부족하지만 blank
는 빈 값입니다.
모델에 옵션을 추가하기 위한 코드는 다음과 같습니다.
from django.db import models
class Product(models.Model):
name = models.TextField(max_length=50, min_length=3, unique=True)
price = models.DecimalField(min_value=0.99, max_value=1000)
creation_date = models.DateField(auto_now_add=True)
class Category(models.Model):
name = models.TextField(max_length=50, min_length=3, unique=True)
키 및 관계
관계형 데이터베이스의 표준 관행은 기본 키(일반적으로 자동으로 증가하는 정수)를 포함하는 테이블의 각 행에 관한 것입니다. Django의 ORM은 id
라는 필드를 추가하여 사용자가 만드는 모든 모델에 이 키를 자동으로 추가합니다.
이 동작을 재정의하려는 경우 기본 키로 사용할 필드를 설정할 수 있습니다. 그러나 대부분의 경우에는 Django의 id
필드를 사용해야 합니다.
관계형 데이터베이스에도 테이블 간 관계가 있습니다. 제품에는 범주가 있고, 직원에게는 관리자가 있으며, 자동차에는 제조업체가 있습니다. Django의 ORM은 모델 간에 만들 수 있는 모든 관계를 지원 합니다.
가장 일반적인 관계는 "일 대 다"로, 기술적으로 외래 키 관계라고 합니다. 외래 키 관계에서 여러 항목은 단일 특성을 공유합니다. 예를 들어 여러 제품이 단일 범주로 그룹화됩니다. 이 관계를 모델링 하려면 ForeignKey
필드를 사용합니다.
관계를 만들려면 자식 개체에 ForeignKey
필드를 추가합니다. 제품이 범주로 그룹화되어있는 경우 Product
클래스에 category
속성을 추가하고 형식을 ForeignKey
로 설정합니다.
Django는 자동으로 부모에 속성을 추가하여 <child>_set
이라는 모든 자식에 관한 액세스를 제공합니다. 여기서 <child>
는 자식 개체의 이름입니다. 이 예에서 Category
에는 범주의 모든 제품에 관한 액세스를 제공하기 위해 product_set
이 자동으로 추가됩니다.
ForeignKey
에는 필수 매개 변수 on_delete
가 있습니다. 이 매개 변수는 부모를 삭제할 경우 수행할 작업을 Django에게 알려줍니다. 즉, 범주를 삭제하는 경우 해당 범주의 제품은 어떻게 되나요?
가장 일반적인 두 가지 옵션은 다음과 같습니다.
CASCADE
예제에서 범주를 삭제하면 모든 제품이 삭제됩니다.PROTECT
제품을 포함하는 범주를 삭제하려고 하면 오류가 반환됩니다.
참고
대부분의 경우 PROTECT
를 사용하는 것이 좋습니다.
관계를 만들기 위해 모델을 업데이트하려면 다음 코드를 사용할 수 있습니다.
from django.db import models
class Product(models.Model):
name = models.TextField()
price = models.DecimalField()
creation_date = models.DateField()
category = models.ForeignKey(
'Category', #The name of the model
on_delete=models.PROTECT
)
class Category(models.Model):
name = models.TextField()
# product_set will be automatically created