쇼핑몰 웹 사이트에서 한 상품의 유사 상품이나 혹은 추천 상품을 보여줄 때의 모델링을 어떻게 해야 할까? 🧐
이 경우는 products 스키마가 자기 자신을 참조하는 모델이기 때문에 self
로 지정해주면 된다.
또한, 한 상품에 여러 추천 상품이 있을 수 있고, 반대로의 경우도 마찬가지이기 때문에 ManyToManyField
를 사용한다.
#product/models.py
from django.db import models
class Product(models.Model):
name = models.CharField(max_length = 50)
recommend = models.ManyToManyField('self', through='RecommendProduct', symmetrical = false)
class Meta:
db_table = 'products'
class RecommendProduct(models.Model):
from_product = models.ForeignKey('Product', on_delete=models.CASCADE, related_name = 'to_product')
to_product = models.ForeignKey('Product', on_delete=models.CASCADE, related_name = 'from_product')
class Meta:
db_table = 'recommend_products'
symmetrical
many to many 는 기본적으로 서로 대칭이 되는 관계다.
위 예에서 symmetrical = false
로 주어 한 상품(A)의 추천상품이 다른 상품(B)으로 등록되면 자동으로 장고가 B의 추천상품으로 A를 등록하는 것을 막는다.
중간테이블 필드명에는 product
앞에 from_
, to_
를 붙여줌으로써 구분지어 준다.
자기참조일 때 중간테이블에 related_name
을 꼭❗️ 지정해줘야 한다.