데이터베이스 모델을 만들었다. 모델을 설계하면서 겪었던 과정 에러들을 나열하고 그 에러들은 장고게시글에서 따로 정리하도록 하겠다.
아직 뭐가 더 필요할지는 모르지만 1차적으로 필요한 모델들을 정리해보았고 해당 모델들이 어떻게 관리되는지에 대해서 간략하게 정리하도록 하겠다. 모델 설계을 체계적으로 해야한다는 생각을 가지고 있었지만 막상 해보려고 하니까 어디서 어떻게 뭐가 필요한지에 대해서 어떻게 DB를 쓰일지에 대해서 내가 해보지 않았기 때문에 꽤 어려웠다. 나름의 1차적으로 필요한것들에 대해서 설계를 해 보았다. 하면서 느낀점은 프로젝트를 만들기전에 어떤 서비스를 어떻게 제공해야할지에 대한 정확한 명세가 필요하다는 것을 느꼈다. 그러나 난 이번 개인프로젝트에서는 부딪히면서 하나하나씩 겪어보는 것이 목표기 때문에 그러한 체계성에는 큰 의미를 두지 않으려고 한다. 아니면 다시 다 밀고 한다는 마인드이다!
# 필요한 모델
현재 내가 작성한 모델은
- User
- Product
- ProductImage
- TradeChain
- OrderBill
이렇게 5개이다. 각 테이블마다 어떤 관계를 가지게 되는지에 대해서 정리해보자.
## 처음 설계
User는 기본적으로 User의 데이터를 담당한다.
Product는 사용자가 교환할 물품에 대한 정보이다. 그리고 여러 이미지를 등록하게끔하기 위하여, ProductImage를 외래키로써 달아준다.
OrderBill은 A사용자가 B사용자에게 자신의 물품과 교환을 신청할때 보내는 신청 내역서이다.
TradeChain은 교환한 물품에 대하여 물품이 성사될 경우 명부저장을 위한 테이블이다.
그러나 이렇게 설계 했을때 어떤 문제를 가지게 되는지 뒤늦게 알아 차렸는데, 그것은 OrderBill과 TradeChain이 각 각 (from_user, to_user) 와 (offer_user, receive_user)로 나뉘게 되는데 유저간의 데이터가 아닌 어떤 물품과 교환을 신청하는지에 대한 데이터를 담고 있어야 한다. 그래서 user가 아닌 product간으로 교환을 신청하고 결과에 대한 로그를 기록할 수 있어야 한다.
## 문제 발생 및 수정
그리하여 다음과 같이 수정했으며, TradeChain에는 각 OrderBill을 연결시켜줬다. 기본은 False로 사용하고 교환이 성사된 제품은 is_trade로 표기하고, 최종적으로는 DB에서 is_trade가 true게시글들을 불러와 거래된 상품들을 보여주게 할 생각이다. 추가적으로 User가 한 물품을 가지고 계속해서 교환해 나갔을때 현재 그 물품이 마지막으로 어떤 제품인지까지 보여주는 기능을 제공할 생각인데 현재 테이블 관계로 가능할지는 잘 모르겠다. 그것도 해보다가 계속 바꿔 나갈 생각이다.
# 모델(테이블)간 관계
스키마 그려주는 프로그램을 쓸걸 그랬다..
그래서 이러한 관계를 가지게 된다. 결국 모든 테이블은 User아래에 있다는 거고, 외래키들을 타고 가다보면 User에 달하는 거다. 잘한지는 모르겠다.
# ModelSerializer
이제 시리얼라이즈를 작성해줘야 하는데, 내가 아직 ModelSerializer에서 Meta에 속성을 주는거 말고, 필드로 따로 적었을때 그 필드가 무슨 역할을 하게 하는지에 대해서 잘 모르겠다.. 그래서 해당 내용을 어느정도 숙지 후에 시리얼라이즈를 작성할 계획이다.
N:M 또는 1:N의 모델 관계를 만들었을때, 시리얼라이즈에 따로 필드를 추가해서 사용해야 하기 때문인데, 그 이유와 역할에 대해서 잘 모르겠다.
# 에러
위 에러가 발생 했었다.
class Product(models.Model) :
name = models.CharField(max_length=255)
status = models.IntegerField([MinValueValidator(1),MaxValueValidator(5)])
category = models.CharField(max_length=155)
detail = models.TextField()
is_trade = models.BooleanField(default=False)
have_user = models.ForeignKey(User,on_delete=models.CASCADE)
## 여기부터
trade_chain = models.ManyToManyField('self', through='TradeChain',through_fields=('offer_user','receive_user') ) # symmetrical 대칭, related_name ??
order_bill = models.ManyToManyField('self', through='OrderBill', through_fields=('from_user','to_user')) # symmetrical 대칭, related_name ??
## 여기까지
created_at = models.DateTimeField(auto_now=True)
맨 처음 trade_chain만 있을때는 migrate까지 잘 됐는데, order_bill 필드를 추가해주자 저 오류가 발생했다. 오류에서 주는 hint와 구글링을 해보면서 얻은 내용은 through_fields을 추가하라는 것이었다.
참고한 블로그에서는
이런식으로 소개하여, 참고하여 작성했다.
symmetrical속성에 대해서 설명하는 글도 있었는데, 저건 following - follwer관계와 같은걸 뜻한다고 했었는데, 일단 내가 생각하기로는 저런 관계는 난 아니거 같아서 추가하지 않았다, Default가 True라고 했다. 일단 머리 박치기하면서 안되면 분명 에러가 날텐데 그러면 또 해결하면서 알아가보자!
# 해야할 일
- ModeSerializer 공부하고 적용시키기
# 참고
###다중이미지
### N:M through_fields (1)
### N:M through_fields (2) :: 내가 참고한 코드
'•프로젝트 > 물물' 카테고리의 다른 글
[물물#0] 개인프로젝트 구조화하기, 계획세우기 (2) | 2022.02.22 |
---|