Project2 : Wanted 클론 - 모델 문제 해결

Joey Lee·2020년 6월 13일
0

Django

목록 보기
18/23

[문제 현황]

  • Account와 Job 사이에는 Like, Bookmark, Apply로 다대다 관계를 가지고 있음.
  • MTM 관계는 Job에서 선언을 했음
  • related_name은 like, bookmark, apply로 클래스명과 동일한 것을 사용했음

[해결 방법]

  • Job에서 account를 정참조할 때나 Account에서 Job을 역참조할 때 related_name을 - 선언하지 않으면 정확히 (Like, Bookmark, Apply 중 어떤 관계를 맺고 있는) 대상을 - 불러와야 할지 알 수가 없어서 에러가 발생함.
  • 따라서 클래스간에 다양한 다대다 관계를 맺을 때는 related_name을 MTM 관계 선언 시 반드시 포함을 해야 함
  • 근데 여기에서는 related_name을 클래스명과 동일하게 사용하니 이게 중간테이블로서 like, bookmark, apply를 가르키는 것인지 아니면 like 관계를 맺고 있는 account를 가르키는 것인지 중복이 일어나서 에러가 난 것임
  • like, bookmark, apply는 중간테이블을 가르키는 name임으로 related_name은 다른 것을 사용해야 함

[변경 후 코드]

class Job(models.Model):
    main_category = models.ForeignKey(MainCategory, on_delete=models.SET_NULL, null=True)
    sub_category  = models.ForeignKey(SubCategory, on_delete=models.SET_NULL, null=True)
    company       = models.ForeignKey(Company, on_delete=models.SET_NULL, null=True)
    name          = models.CharField(max_length=200)
    article       = models.TextField(null=True)
    deadline      = models.CharField(max_length=200, null=True)
    reward_amount = models.DecimalField(max_digits=10, decimal_places=2, null=True)
    created_at    = models.DateTimeField(auto_now_add=True)

    likes         = models.ManyToManyField('account.Account', related_name='like_jobs', through='Like')
    bookmarks     = models.ManyToManyField('account.Account', related_name='bookmark_jobs', through='Bookmark')
    applies       = models.ManyToManyField('account.Account', related_name='apply_jobs', through='Apply')
    shares        = models.ManyToManyField('account.Account', related_name='share_jobs', through='Share')

2. 양쪽 모델에서 서로 참조해서 일어난 오류

[문제현황]

  • Account 모델 내 profile 클래스가 Job 모델 내에 Category 클래스를 참조
  • Job 모델은 Account 클래스를 Job, Like, Bookmark, Apply 등에서 참조
  • 서로 참조를 해야 하기에 양쪽에서 각각의 클래스를 임포트하도록 하였는데, 에러 발생

[문제 해결]

  • 더 많이 참조를 하는 Job 모델은 그대로 Account를 임포트하도록 함
  • Account 모델에서는 Job 모델을 임포트하지 않고, profile 클래스에서 참조하는 대상인 'job.MainCategory', 'job.SubCategory'로 ''를 넣어서 처리하니 문제 해결됨

[변경 후 코드]

class Profile(models.Model):
    main_category = models.ForeignKey('job.MainCategory', on_delete=models.SET_NULL, null=True)
    sub_category  = models.ForeignKey('job.SubCategory', on_delete=models.SET_NULL, null=True)
    career        = models.OneToOneField('Career', on_delete=models.SET_NULL, null=True)

    class Meta:
        db_table = 'profiles'

3. 하나의 모델을 여러 개의 모델이 참조할 때

[문제현황]

  • Account 모델을 Job, Company, Resume 모델이 다 참조를 함
  • 에러 발생

[문제해결]

  • Company 모델에서만 Account 모델을 임포트함
  • Job, Resume 모델에서는 참조하는 대상에 ' '를 씌어서 입력하니 문제 해결됨
    예) 'account.Account'

Q) ForeignKey를 사용할 때 참조대상을 언제 ' '로 씌워서 입력해야 되는가?

  • 임포트하지 않고 해당모델 클래스에 접근할 때
  • 아직 선언하지 않은 클래스에 접근할 때 (해당 문서에서 뒤 쪽에서 선언되는 클래스를 참조할 때)

기타

  • ForeignKey 참조 on_delete=models.CASCADE할 때 default=''
    account = models.ForeignKey('account.Account', on_delete=models.CASCADE, default='')
profile
안녕하세요!

0개의 댓글