Django , Related_name

finelinefe·2020년 10월 7일
0
post-thumbnail

<추후수정예정>

1) product <-> cart <-> user
2) product <-> wishlist <-> user

카트와 위시리스트라 동시에 프로덕트와 유저를 참조로하는 중간테이블이 된 상황

_다대다 관계 선언은 프로덕트 혹은 유저쪽에서 한번만 한다_

class Product(models.Model):
    name       = models.CharField(max_length = 100) 
    image_url  = models.URLField()
    series_id  = models.ForeignKey('Series', on_delete = models.CASCADE)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)
    
    ## 변수같은 의미. 똑같이 유저라고 하면 마지막 값으로 대체되기 때문에 변수같이 선언도 다르게, related_name도 다르게 // 다대다는 프로덕트나 유저 둘중 하나만 선언
    # user = models.ManyToManyField('User', through = 'Cart' related_name = "")
    # user = models.ManyToManyField('User', through = 'WishList' related_name = "")
    
    cart = models.ManyToManyField('User', through = 'Cart', related_name = "")
    wish_list = models.ManyToManyField('User', through = 'WishList', related_name = "")

그리고 중간테이블인 cart / wishlist 두 중간테이블에는 외래키를 넣어주되
이름을 다르게,(변수의 의미라고 생각하면 된다) + related_name 을 각각 넣어준다(임의지정)

####### (product) <-> (cart) <-> (user)
class Cart(models.Model):
    count      = models.CharField(max_length = 100)
    created_at = models.DateTimeField(auto_now = True)
    updated_at = models.DateTimeField(auto_now_add = True)
    
    ## 중간테이블인 카트 입장에선 프로덕트와 유저로 뻗어나가는게 포린키.
    product    = models.ForeignKey('Products', on_delete = models.CASCADE)
    user       = models.ForeignKey('Users', on_delete = models.CASCADE) 
    
    def __str__(self):
        return self.name
    
    class Meta:
        db_table = "carts"
        

####### (product) <-> (whislist) <-> (user)       
class WishList(models.Model): 
    ## 중간테이블인 카트 입장에선 프로덕트와 유저로 뻗어나가는게 포린키.
    product    = models.ForeignKey('Products', on_delete = models.CASCADE)
    user       = models.ForeignKey('Users', on_delete = models.CASCADE) 
    
    def __str__(self):
        return self.product.name
    
    class Meta:
        db_table = "wish_lists"

0개의 댓글