[TIL] Self-referencing

양희연·2020년 8월 30일
0

Django

목록 보기
14/14
post-thumbnail

쇼핑몰 웹 사이트에서 한 상품의 유사 상품이나 혹은 추천 상품을 보여줄 때의 모델링을 어떻게 해야 할까? 🧐



이 경우는 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을 꼭❗️ 지정해줘야 한다.

profile
꾸준히 나아가자!

0개의 댓글