Introduction to Django models
Django에서 모델은 django.db.models.Model 클래스의 하위 클래스입니다 . 모델에는 필드를 조작하는 하나 이상의 필드와 메서드가 포함되어 있습니다.
기본적으로 Django 모델은 모델의 각 필드가 테이블의 column을 나타내는 데이터베이스의 단일 테이블에 매핑 됩니다.
응용 프로그램에는 models.py 모듈에 저장된 0개 이상의 모델이 있을 수 있습니다. 예를 들어 다음은 blog 응용 프로그램에 대한 Post 모델을 정의합니다.
from django.db import models
from django.utils import timezone
class Post(models.Model):
title = models.CharField(max_length=120)
content = models.TextField()
published_at = models.DateTimeField(default=timezone.now)
Post 모델에는 title, content 및 published_at 필드가 있습니다. Post 모델을 기반으로 Django는 다음 SQL 코드를 사용하여 데이터베이스에 테이블을 만듭니다.
CREATE TABLE "blog_post" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"title" varchar(120) NOT NULL,
"content" text NOT NULL,
"published_at" datetime NOT NULL,
);
테이블 blog_post의 이름은 응용 프로그램 및 모델 이름에서 자동으로 파생됩니다.
application.model
이 예제에서 Django는 Post 모델에 대한 테이블 blog_post를 만듭니다.
Django에서 생성된 기본 이름을 사용하는 대신 테이블 이름을 지정하려면 다음과 같이 Meta 클래스의 db_table 속성을 사용할 수 있습니다.
from django.db import models
from django.utils import timezone
class Post(models.Model):
title = models.CharField(max_length=120)
content = models.TextField()
published_at = models.DateTimeField(default=timezone.now)
class Meta:
db_table = 'posts'
이 경우 Post 모델은 생성된 blog_post 테이블 대신 posts 테이블에 매핑됩니다 .
테이블을 생성할 때 Django는 자동으로 id 필드를 테이블의 기본 키(primary key)로 추가합니다. id 필드는 프로젝트의 settings.py 파일에 지정된 type의 자동 증가 필드입니다.
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
id가 아닌 다른 field ( post_id )를 primary_key로 지정하려면 다음처럼 지정한다.(id필드는 자동 미생성)
post_id = models.BigAutoField(primary_key=True)
Using models
모델을 정의한 후에는 프로젝트 settings.py 의 INSTALLED_APPS 목록에 애플리케이션 이름을 등록하여 모델을 사용할 것임을 Django에 알려야 합니다.
INSTALLED_APPS = [
# ...
'blog',
]
Built-in models
Django에는 User가 from django.contrib.auth.models 모듈과 같은 내장 모델이 함께 제공됩니다 . 사용자 모델을 사용하려면 models.py 파일로 import해야 합니다.
from django.contrib.auth.models import User
Foreign keys
blog 애플리케이션 내의 각각의 포스트 는 사용자에 의해 생성되고, 사용자는 0개 이상의 포스트를 생성할 수 있다. 이를 일대다 관계라고 합니다.
일대다 관계를 모델링하려면 ForeignKey 필드를 사용합니다.
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=120)
content = models.TextField()
published_at = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
In this example, the auth_id is a foreign key that creates a relationship between blog_post table and auth_user table. Note that the auth_user table is the Django-provided table.
The __str__() method
Post 모델의 인스턴스를 문자열로 사용하면 Django는 __str__() 메서드를 호출하고 그 결과를 표시합니다.
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=120)
content = models.TextField()
published_at = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
Adding Meta class to the Model class
Meta 클래스를 사용하면 모델을 구성할 수 있습니다. 예를 들어, 다음은 Post 모델 클래스 내에서 Post를 내림차순(-published_at)으로 published_at별로 정렬하는 Meta 클래스를 정의합니다.
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=120)
content = models.TextField()
published_at = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
class Meta:
ordering = ['-published_at']
모델을 정의한 후 마이그레이션을 만들고 적용하여 데이터베이스에 테이블을 만들 수 있으며, 이에 대해서는 다음 자습서에서 설명합니다.
Summary
- Django 애플리케이션의 models.py 파일에서 모든 모델을 정의합니다.
- django.db.models.Model에서 상속되는 클래스를 정의하여 모델을 만듭니다.
- 모델은 데이터베이스의 테이블에 매핑되며, 각 필드는 데이터베이스 테이블의 column에 매핑됩니다.
- __str__() 메서드를 재정의하여 모델의 문자열 표현을 반환합니다.
- Meta 클래스를 사용하여 모델을 구성합니다.
'Django11' 카테고리의 다른 글
Django Flash Messages (0) | 2023.04.29 |
---|---|
Django Migrations (0) | 2023.04.28 |
Django 배포 (0) | 2023.04.14 |
Getting Started with Django (0) | 2023.04.08 |
Django Create App (0) | 2023.04.08 |
댓글