장고에서 모델은 데이터베이스의 틀을 만드는 역할을 한다.
class Customer(models.Model):
name=models.CharField(max_length=200, null=True)
phone=models.CharField(max_length=200, null=True)
email=models.CharField(max_length=200, null=True)
date_created=models.DateTimeField(auto_now_add=True, null=True)
# 데이터 개체를 출력할 때 name속성의 값으로 출력해주는 메소드
def __str__(self):
return self.name
모델은 클래스 형식으로 작성하며 각 속성은 데이터 테이블의 컬럼이 된다. 모델을 작성하면 이를 데이터베이스에 반영하는 작업이 필요한데 이를 마이그레이션이라고 한다.
python manage.py makemigrations
를 입력해 변경된 내용을 알려주고 python manage.py migrate
를 입력해 변경된 것을 실제로 데이터베이스에 반영한다.
저장된 데이터를 admin이 관리하기 위해서는 작성한 모델을 import 하고 admin.py에 admin.site.register(모델명)을 입력한다.
기본 입력된 것을 선택하도록 데이터를 만들어야 한다면 아래와 같이 선택지를 만들고 필드 안에서 choices=선택지변수명 옵션을 준다.
class Order(models.Model):
STATUS=(
('Pending', 'Pending'),
("Out for delivery", "Out for delivery"),
("Delivered", 'Delivered'),
)
...
status=models.CharField(max_length=200, null=True, choices=STATUS)
일반적으로 데이터필드를 생성하면 1:N 관계로 생성하지만 N:M 관계가 필요한 데이터도 존재한다. 이를 위해 장고에서는 필드 형식으로 ManyToManyField
를 사용한다.
class Tag(models.Model):
name=models.CharField(max_length=200, null=True)
def __str__(self):
return self.name
class Product(models.Model):
CATEGORY=(
('Indoor', 'Indoor'),
('Outdoor', 'Outdoor'),
)
name=models.CharField(max_length=200, null=True)
price=models.FloatField()
category=models.CharField(max_length=200, null=True, choices=CATEGORY)
description=models.CharField(max_length=200, null=True, blank=True)
date_created=models.DateTimeField(auto_now_add=True, null=True)
# Product 테이블과 Tag 테이블이 N:M관계이다.
tags=models.ManyToManyField(Tag)
쿼리셋이란 데이터베이스에서 가져온 객체들의 집합을 뜻한다. 쿼리셋은 1개 이상의 필터를 사용할 수 있으므로, 쿼리의 결과를 조건에 맞게 줄일 수 있다. 다음과 같은 형식으로 사용한다.
queryset = Customer.objects.all()
변수명 = 모델명.모델 객체 속성.메소드의 순서로 작성하는데, 메소드의 종류는 무수히 많지만 모든 객체를 가져오는 all(), 조건에 맞는 하나의 객체를 가져오는 get(), 조건에 맞는 모든 객체를 가져오는 filter() 등이 있다.
또한 객체1.객체2_set은 객체1 중 객체2에 해당하는 모든 쿼리셋을 생성해 준다.
테이블에서 참조하고 있는 외래키 테이블의 필드를 가져오기 위해서는 filter(외래키__필드명="필드값")을 사용한다. 여기서 밑줄은 2개이다.(Double Underscore)