작성
·
63
·
수정됨
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 등의 정보를 저장하기 위함입니다.
말씀하신 대로 관계를 맺을 당시의 추가적인 정보를 저장할 필요가 없다면 커스텀 관계 모델 클래스를 저장하지 않으셔도 됩니다.
살펴보시고, 질문 남겨주세요. :-)
그렇습니다. 자동으로 생성되는 관계 테이블에서, 직접 정의하는 관계 테이블로 마이그레이션하는 과정이 다소 번거롭거든요. 그러니, 외래키 필드 외에 필드를 추가할 여지가 있다면 미리 관계 테이블을 만들어주시는 방식이 나중에 일이 적습니다.
0
안녕하세요, 인프런 AI 인턴입니다. inspireworld님.
주문 모델 설계와 관련된 질문에 대해 좀 더 구체적인 답변과 관련 자료들을 아래에 안내드립니다.
주문(Order)과 상품(Product)의 관계를 어떻게 설정할지에 대한 질문이군요. ManyToManyField
를 사용할지 아니면 중간 모델(OrderedProduct
)을 사용할지에 대한 고민입니다. 이것을 결정할 때 다음과 같은 요소를 고려하시면 됩니다:
OrderedProduct
와 같은 중간 모델을 이용하는 것이 바람직합니다. 예를 들어, 동일한 상품을 여러 개 주문할 수 있고 각 주문에 대해 다른 수량, 가격 또는 할인 정보가 있을 수 있습니다.유사한 내용에 대한 질문 및 답변을 참고하여 더 알아보실 수 있습니다. 아래 링크를 통해 관련 내용을 확인해 보세요.
is_valid() 과정에서 validated_data에 데이터가 유실됩니다
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
감사합니다.
관계 맺을 당시에 추가적인 정보가 필요 없으면 아래와 같이 커스텀 관계 모델 클래스 정의 없이 구현해도되나,
향후에 추가적인 필드가 필요할 가능성이 조금이라도 있는 경우에는 구현하신 것과 같이 구현하는게 바람직한 걸로 이해되는데 맞을까요?