T.I.L May 12, 2023 (DRF 팀 프로젝트 중 모델들의 관계에 대해 어려움을 겪고 있습니다.)
2023. 5. 15. 02:45ㆍT.I.L (Today_I_Learned)
어려움을 겪고 있는 문제
users앱 User모델
더보기
# 사용자 기본 모델
class User(AbstractBaseUser):
user_name = models.CharField('ID', max_length=30, unique=True, error_messages={"unique": "이미 사용 중이거나 탈퇴한 사용자의 아이디입니다!"})
email = models.EmailField('EMAIL', max_length=255, unique=True, error_messages={"unique": "이미 사용 중이거나 탈퇴한 사용자의 이메일입니다!"})
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
created_at = models.DateTimeField("계정 생성일", auto_now_add=True)
last_password_changed = models.DateTimeField("비밀번호 마지막 변경일", auto_now=True)
withdraw = models.BooleanField("회원 비활성화", default=False)
withdraw_at = models.DateTimeField("계정 탈퇴일", null=True)
objects = UserManager()
USERNAME_FIELD = 'user_name'
REQUIRED_FIELDS = ["email",]
def __str__(self):
return f"[ID]{self.user_name}"
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
@property
def is_staff(self):
return self.is_admin
users앱 UserProfile모델
더보기
# 사용자 프로필 모델
class UserProfile(models.Model):
profile_image = models.ImageField("PROFILE IMAGE", default="default_profile_pic.jpg", upload_to="profile_pics", blank=True)
nickname = models.CharField("NICKNAME", max_length=10, null=True, unique=True, error_messages={"unique": "이미 사용 중이거나 탈퇴한 사용자의 닉네임입니다!"})
age = models.IntegerField("AGE", null=True)
gender_choices = [("MALE", "male"), ("FEMALE", "female"), ("OTHER", "other"),]
gender = models.CharField("GENDER", max_length=6, null=True, choices=gender_choices,)
introduction = models.TextField(null=True, default="안녕하세요!")
review_cnt = models.PositiveIntegerField("Review cnt", default=0)
user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name="USER", related_name="user_profile")
followings = models.ManyToManyField("self", symmetrical=False, blank=True, related_name="followers")
def __str__(self):
return f"[ID]{self.user.user_name}, [NICKNAME]{self.nickname}"
@property
def review_count_add(self):
self.review_cnt += 1
self.save()
@property
def review_count_remove(self):
self.review_cnt -= 1
self.save()
posts앱 Post모델
더보기
# 게시글 모델
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_post')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
likes = models.ManyToManyField(User, blank=True, related_name="like_posts")
def __str__(self):
return self.title
해결을 위해 시도한 것 & 정리 한 것
1. 위의 세 모델들 중 User모델은 다른 두 모델과 관계가 있습니다.
User모델 - UserProfile모델 = 1:1 관계
User모델 - Post 모델 = 1:N 관계
2. User모델을 이용해 UserProfile모델에서도 Post모델을 참조할 수도 있겠다는 생각입니다.
시도할 것
1. 모델간의 관계에 대해 추가적으로 공부해야 할 것 같습니다.
2. 해결 할 수 있는 더 작은 단위로 연습을 해 본 후 다시 해결해 봐야 할 것 같습니다.
'T.I.L (Today_I_Learned)' 카테고리의 다른 글
T.I.L May 17, 2023 (DRF 모델간 관계(참조)에 관해 겪던 문제 해결) (0) | 2023.05.17 |
---|---|
T.I.L May 15, 2023 (DRF 팀 프로젝트 피드백) (0) | 2023.05.15 |
T.I.L May 11, 2023 (프로그래머스 - 기사단원의 무기(Python)) (0) | 2023.05.11 |
T.I.L May 10, 2023 (프로그래머스 - 크기가 작은 부분문자(Python)) (0) | 2023.05.10 |
T.I.L May 9, 2023 (DRF 사용자 검증 기능 구현 중 발생한 오류) (0) | 2023.05.09 |