T.I.L May 12, 2023 (DRF 팀 프로젝트 중 모델들의 관계에 대해 어려움을 겪고 있습니다.)

2023. 5. 15. 02:45T.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. 해결 할 수 있는 더 작은 단위로 연습을 해 본 후 다시 해결해 봐야 할 것 같습니다.