[WatchaPedia Clone] Day 2. 모델링 리뷰, 모델

AQuery 모델링 리뷰

열정반 과욕반으로 왓챠피디아에 있는 모든 요소를 모델링하겠다는 의지로 20~30개의 테이블에 대해 모델링을 하고나서, 멘토 리뷰에서 얼마나 수정할 사항이 많을지, 다 뒤엎어야하는건 아닌지 긴장된 상태로 리뷰를 받았지만, 다행히 큰 틀에서 뒤엎는 수준은 아니고 네이밍에 관한 컨벤션, 일부 테이블 통합 등 감당할 범위 내에서 피드백을 받았다.

간략히 피드백에서 수정해야할 사항으로 지적받은 부분은

  1. 유저 간 follows, blocks 테이블을 통합해서 관계를 갖는 user를 셀프 참조 받고, 이후에 어떤 관계(팔로우, 차단)를 갖는지를 별도의 컬럼에 표시
  2. 길지 않은 텍스트(user_bio)는 TextField보다 CharField를 활용
  3. users 테이블의 language, country외부 테이블과 연결하여 정규화
  4. 테이블명과 첫 번째 속성값명이 동일한 경우가 많은데, 이 부분이 추후 테이블 활용과정에서 혼동될 수 있으므로 name 등으로 수정할 필요가 있음
    (`countries'-'country', 'genres'-'genre' 등)
  5. create_date보다 created_at이라는 용어를 더 자주 활용
  6. book_overviewssub_category에 대해서도 정규화가 필요
  7. 1과 유사하게 wish, watching, not_interested 리스트를 통합
  8. 자주 업데이트 되는 데이터라면 updated_at 항목을 활용


(어제와 똑같은 것 같지만 많은 부분에서 고민하고 수정했다.)

위 피드백 받은 부분에 대해 AQuery 모델링에 반영 후 models.py 작성을 시작했다.

models.py 작성

models.py는 일단 App을 나누는 부분까지는 생각하지 않고 모델링한 전체 내용에 대해 작성하였는데 가장 큰 부분인 userscontent를 중심으로 각각 맡아서 작성하였다.

내가 맡은 부분은 users와 관련된 테이블 작성을 맡았는데, 가장 어려웠던 부분은 ManyToManyField를 사용하는 방법과 관련하여 through, related_name 등을 활용하는 부분이 조금 혼란스러웠고, 추후 참조-역참조 등으로 API에서 손쉽게 데이터에 접근하기 위해 어떤 방식으로 만들어야하는지도 조금 더 고민해서 짜면서 시간을 가장 많이 소요하였다. 이 과정에서 소헌 멘토님 블로그를 포함해서 여러 블로그를 참고하며 공부했는데, 관련 내용은 추후 다른 글에 포스팅하고 여기에서는 공부하면서 참고했던 블로그만 남긴다.

https://himanmengit.github.io/django/2018/02/06/DjangoModels-08-ManyToMany-Self-Symmetrical-Intermediate.html
https://velog.io/@hj8853/Django-ManyToMany-relatedname
https://show-me-the-money.tistory.com/entry/Django%EC%97%90%EC%84%9C-Many-To-Many-%ED%95%84%EB%93%9C-%EB%8B%A4%EB%A3%A8%EA%B8%B0
https://whatisthenext.tistory.com/118

결과적으로 고민했던 유저 간 관계 부분은 아래와 같이 구현했다.

class User(models.Model):
    email            = models.CharField(max_length=45)
    password         = modles.CharField(max_length=250)
    profile_image    = models.CharField(max_length=1000, null=True)
    user_bio         = models.TextField(max_length=300, null=True)
    language         = models.ForeignKey(Language, on_delete=models.SET_DEFAULT, default='ko-kr')
    country          = models.ForeignKey(Country, on_delete=models.SET_DEFAULT, default='KO')
    disclosure_scope = models.ForeignKey(Disclosure, on_delete=models.SET_DEFAULT, default='Open')
    background_image = models.CharField(max_length=1000, null=True)
    username         = models.CharField(max_length=20)
    relations        = models.ManyToManyField('self', through='Relation', symmetrical=False)
    class Meta:
        db_table = 'users'


class Relation(models.Model):
    from_user       = models.ForeignKey(User, on_delete = models.CASCADE, related_name='relations_by_from_user')
    to_user         = models.ForeignKey(User, on_delete = models.CASCADE, related_name='relations_by_to_user')
    relation_status = models.ForeignKey(RelationStatus, on_delete = models.CASCADE)
    class Meta:
        db_table = 'relations'

이 부분도 맞는지 여부는 내일 피드백을 받아보고 수정할 사항에 대해 수정해야할 것 같다.

좋은 웹페이지 즐겨찾기