먼저 데이터 구조를 생각해보기
이제 화면을 만들기 전에 먼저 생각해야 하는 것이 있습니다.
우리가 무엇을 저장할 것인가?
Django는 데이터 중심 프레임워크이기 때문에, 페이지보다 먼저 모델 설계를 생각하는 습관이 중요합니다.
이번 공부시간 기록기에서는 아래 정보를 저장해보겠습니다.
왜 모델을 먼저 생각해야 할까?
모델이 정해지면:
DB 구조가 정해지고
admin 화면 구조가 정해지고
Form 구조가 정해지고
나중에 Serializer 구조도 정해집니다.
즉 Django에서는 아래 사고 흐름이 중요합니다.
헷갈린부분 클로드 물어본 정보_ 각각의 구조가 정해진다?
## Django 모델 구조 완전 설명
---
## 1️⃣ 맨 위 - Django로부터 모델 불러오기
```python
from django.db import models
Django가 만들어놓은
모델 기능을 가져오는 것!
models.CharField
models.IntegerField
models.DateField
→ 이것들을 쓰려면
반드시 import 해야 함!
class Study(models.Model):
↑ ↑
내가 만든 Django Model을
테이블명 상속받음
models.Model 을 상속받아야
Django의 모든 DB 기능을
자동으로 사용 가능!
상속 안하면? ❌
→ save() 없음
→ delete() 없음
→ DB 연결 안됨
class Study(models.Model):
title = models.CharField(max_length=200)
study_date = models.DateField()
hours = models.PositiveIntegerField()
DB 테이블의 컬럼을 정의하는 곳!
title → DB에 title 컬럼 생성
study_date → DB에 study_date 컬럼 생성
hours → DB에 hours 컬럼 생성
class Meta:
ordering = ['-study_date']
verbose_name = '공부 기록'
verbose_name_plural = '공부 기록들'
"테이블 자체에 대한 설정"
필드가 컬럼 설정이라면
Meta는 테이블 전체 설정!
class Meta:
# 1. 정렬 순서
ordering = ['-study_date']
# → 조회할때 항상 최신날짜순 자동정렬
# → 없으면 매번 .order_by() 써야함 ❌
# 2. Admin 이름 (단수)
verbose_name = '공부 기록'
# → Admin에서 "공부 기록 추가" ✅
# → 없으면 "Study 추가" ❌
# 3. Admin 이름 (복수)
verbose_name_plural = '공부 기록들'
# → Admin에서 "공부 기록들 목록" ✅
# → 없으면 "Studys 목록" ❌ (영어 복수 오류)
# 4. DB 테이블명 지정
db_table = 'my_study'
# → 없으면 자동으로 앱이름_클래스명
# 5. 인덱스 (검색 속도)
indexes = [
models.Index(fields=['title'])
]
def __str__(self):
return f'{self.title} ({self.study_date})'
✅ 안써도 에러는 안남
❌ 없으면 불편함!
없을때 Admin 목록
→ Study object (1)
→ Study object (2)
→ Study object (3)
# 뭐가 뭔지 모름! ❌
있을때 Admin 목록
→ Django 공부 (2024-03-13)
→ Python 공부 (2024-03-12)
→ 알고리즘 (2024-03-11)
# 한눈에 보임! ✅
@property
def total_minutes(self):
return self.hours * 60 + self.minutes
✅ 완전히 선택사항!
✅ 없어도 에러 없음
✅ 없어도 동작함
# 대신 없으면 매번 직접 계산해야 함
study.hours * 60 + study.minutes # ❌ 매번 반복
# 있으면 편하게 사용
study.total_minutes # ✅ 한번만 정의하고 계속 사용
from django.db import models → 필수! ✅ (없으면 에러)
↓
class Study(models.Model): → 필수! ✅ (없으면 에러)
↓
필드 정의 → 필수! ✅ (없으면 테이블 의미없음)
↓
class Meta → 선택! (없어도 동작하지만 불편)
↓
def __str__ → 선택! (없어도 동작하지만 불편)
↓
@property → 선택! (편의기능)
| 구성요소 | 필수여부 | 없으면? |
|---|---|---|
from django.db import models | ✅ 필수 | 에러 발생 |
class Study(models.Model) | ✅ 필수 | 에러 발생 |
| 필드 정의 | ✅ 필수 | 저장할 데이터 없음 |
class Meta | 🔺 권장 | 정렬/이름 수동 설정 |
__str__ | 🔺 권장 | Admin에서 불편 |
@property | ⚪ 선택 | 매번 직접 계산 |
💡
__str__은 선택이지만
거의 모든 Django 개발자가 필수처럼 작성해요!
Admin에서 데이터 확인할 때
없으면 너무 불편하거든요! 😅
--------
두가지왜? 확인해야하나?
프로젝트 루트에 db.sqlite3 파일이 생겼는지
study/migrations/ 폴더에 migration 파일이 생겼는지
-----