web/django

Django 모델 생성하고 One-To-Many 관계 형성하기

민사민서 2024. 5. 13. 23:50

Post 모델을 이미 생성한 상태라고 가정.

 

django-admin startapp account

새로운 app을 만들고요

 

INSTALLED_APPS = [    
    ...    
    'account', # 추가("account.apps.AccountConfig"도 가능)
]

프로젝트 serttings.py도 수정을 해야겠죠

 

사실 장고에서는 기본적으로 User 모델을 제공

하지만 이 모델은 최소한의 기본적인 기능만을 제공

따라서 기본 field 이외의 커스터마이징이 필요한 경우 이를 확장해서 사용

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class UserProfile(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  college = models.CharField(max_length=32, blank=True)
  major = models.CharField(max_length=32, blank=True)

  def __str__(self):
    return f"id={self.id}, user_id={self.user.id}, college={self.college}, major={self.major}"

account/models.py도 다음과 같이 작성을 합니다.

 

- User Model을 One-to-One modeling함으로써 User Model 수정하지 않고 확장시킴

- 데이터베이스의 UserProfile 테이블의 객체가 User 테이블의 객체와 반드시 한 번만, 일대일로 매칭

- 또한 여기서 UserProfile의 객체 userprofile1이 User의 객체 user1과 매칭되어 있다면, userprofile1.user 을 통해 user1에 접근할 수 있을 뿐만 아니라, 반대로 user1.userprofile을 통해 profile1을 데려올 수 있게 됨
- User 모델에 UserProfile을 다시 OneToOneField로 추가하지 않아도, 이미 UserProfile 모델에 작성한 OneToOneField만으로도 자동으로 역방향의 접근이 가능한 것

- on_delete=models.CASCADE : UserProfile 객체와 연결되어있는 User 객체가 삭제되는 경우, 그 UserProfile 객체도 같이 삭제되어야 함

 

$ python manage.py makemigrations
$ python manage.py migrate

model을 만들면 DB의 페이지 테이블 수정해야하므로 migration 필요합니다

 

Post 모델과 UserProfile 모델의 관계를 생각해보자.

One(UserProfile) to Many(Post) 관계이다. 한 User가 여러 개의 Post를 생성할 수 있음

=> Post 모델에서 UserProfile 모델의 foreign key를 관리해야 한다

 

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=256)
    content = models.TextField()
    created_at = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, null=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

post/models.py 에다가 author 라는 foreign key를 추가해준다

- author에는 User 객체의 primary key인 id 정보가 담기겠죠

- null = True로 세팅함으로써 해당 column NULL 값 가질 수 있게 해줌

 

cf) on_delete 옵션 종류

 

$ python manage.py makemigrations
$ python manage.py migrate

model을 수정했으므로 다시 migration 해줍니다

 

끗!