인프런 커뮤니티 질문&답변

inspireworld님의 프로필 이미지
inspireworld

작성한 질문수

파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편

주문 모델 설계

8강 주문 모델 설계에서 따로 ManyToMany 관계를 위한 모델을 선언해준 이유?

작성

·

51

·

수정됨

0

 

class Order(models.Model):
...
    products = models.ManyToManyField(
        Product,
        blank=False,
    )
...

그럴 가능성은 드물지만 Product 수량은 1개로만 주문 가능하고 상품이름과 가격이 변동 불가하다고 하였을 때( 1개 주문시, 품절 되는 상품)는 별도의 OrderedProduct 클래스 없이 위와 같이 구현해도 무방한가요?

class OrderedProduct(models.Model):
    order = models.ForeignKey(
        Order,
        on_delete=models.CASCADE,
        db_constraint=False,
    )
    product = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        db_constraint=False,
    )
...

따로 OrderedProduct 클래스에 FK로 order와 product를 두신건 이름/가격 정보의 변경 가능성, 2개이상의 수량 선택 문제를 해결하기 위함과 향후에 추가적인 모델의 유연성 때문에 이렇게 설계 해두신걸까요?

답변 2

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

OrderedProduct 모델은 Order와 Product 간의 M2M 관계를 저장하기 위함입니다.

ManyToManyField에서는 반드시 관계를 저장하기 위한 테이블이 반드시 필요합니다.

강의에서는 명시적으로 through="OrderedProduct" 인자를 통해 명시적으로 관계 모델을 지정했는 데요. through 인자를 지정하지 않더라도 관계 모델이 자동으로 생성됩니다.

Order와 Product에 대한 관계를 저장하는 모델에서는 Order 외래키 필드와 Product 외래키 필드가 반드시 정의되어야 하구요. 자동으로 생성되는 관계 모델에서는 pk 필드와 이 두 외래키 필드로만 생성이 되는 데요. OrderedProduct 모델 클래스를 정의한 것은 관계를 맺을 당시의 name,price,quantity 등의 정보를 저장하기 위함입니다.

말씀하신 대로 관계를 맺을 당시의 추가적인 정보를 저장할 필요가 없다면 커스텀 관계 모델 클래스를 저장하지 않으셔도 됩니다.

살펴보시고, 질문 남겨주세요. :-)

inspireworld님의 프로필 이미지
inspireworld
질문자

감사합니다.

관계 맺을 당시에 추가적인 정보가 필요 없으면 아래와 같이 커스텀 관계 모델 클래스 정의 없이 구현해도되나,

class Order(models.Model):
...
    products = models.ManyToManyField(
        Product,
        blank=False,
    )
...

향후에 추가적인 필드가 필요할 가능성이 조금이라도 있는 경우에는 구현하신 것과 같이 구현하는게 바람직한 걸로 이해되는데 맞을까요?

이진석님의 프로필 이미지
이진석
지식공유자

그렇습니다. 자동으로 생성되는 관계 테이블에서, 직접 정의하는 관계 테이블로 마이그레이션하는 과정이 다소 번거롭거든요. 그러니, 외래키 필드 외에 필드를 추가할 여지가 있다면 미리 관계 테이블을 만들어주시는 방식이 나중에 일이 적습니다.

0

안녕하세요, 인프런 AI 인턴입니다. inspireworld님.

주문 모델 설계와 관련된 질문에 대해 좀 더 구체적인 답변과 관련 자료들을 아래에 안내드립니다.

기존 질문에 대한 설명

주문(Order)과 상품(Product)의 관계를 어떻게 설정할지에 대한 질문이군요. ManyToManyField를 사용할지 아니면 중간 모델(OrderedProduct)을 사용할지에 대한 고민입니다. 이것을 결정할 때 다음과 같은 요소를 고려하시면 됩니다:

1. 상품 수량 및 추가 정보:

  • 만약 상품이 주문 시 수량이나 추가적인 정보를 가져야 한다면 OrderedProduct와 같은 중간 모델을 이용하는 것이 바람직합니다. 예를 들어, 동일한 상품을 여러 개 주문할 수 있고 각 주문에 대해 다른 수량, 가격 또는 할인 정보가 있을 수 있습니다.

2. 상품 정보의 변경 가능성:

  • 주문이 생성된 이후에도 상품의 이름이나 가격이 변경될 가능성이 있다면, 주문 당시의 정보를 유지하기 위해 중간 모델을 만드는 것이 좋습니다. 이렇게 하면 주문이 생성될 때의 상품 정보가 유지됩니다.

3. 다른 활용 가능성:

  • 향후에 시스템이 확장되어 더 많은 정보를 저장해야 할 필요가 생길 가능성도 고려해보세요. 중간 모델을 사용하면 별도의 필드를 추가하거나 로직을 확장하기 용이한 설계를 유지할 수 있습니다.

유사한 내용 질문 & 답변

유사한 내용에 대한 질문 및 답변을 참고하여 더 알아보실 수 있습니다. 아래 링크를 통해 관련 내용을 확인해 보세요.

  1. 옵션 설계에 관해서

    • 옵션 상품 설계에 대한 질문과 답변이 포함되어 있어 많은 도움이 될 것입니다.
  2. is_valid() 과정에서 validated_data에 데이터가 유실됩니다

    • 중간 모델 및 데이터 유실 방지에 대한 구체적 사례가 포함되어 있습니다.
  3. 외래키 설정을 다르게 하는 경우

    • 외래키 설정 방법과 장단점에 대한 토론이 포함되어 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

inspireworld님의 프로필 이미지
inspireworld

작성한 질문수

질문하기