sklass의 s-class 프로그래밍 blog

[Django] _set - 테이블의 키를 외래키로 갖는 테이블에 대한 함수 본문

django

[Django] _set - 테이블의 키를 외래키로 갖는 테이블에 대한 함수

sklass 2021. 12. 3. 16:56

아래와 같은 테이블 스키마가 있다고 가정해봅시다.

class Shop(models.Model):
    shop_name = models.CharField(max_length=20)
    shop_address = models.CharField(max_length=40)

class Order(models.Model):
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
    order_date = models.DateTimeField("date ordered")
    address = models.CharField(max_length=40)
    estimated_time = models.IntegerField(default=-1)
    deliver_finish = models.BooleanField(default=0)

Order 테이블은 Shop을 외래키로 해서 생성되는 테이블입니다.

그렇다면, Shop 아이템을 생성하고, 생성된 Shop 아이템의 키를 외래키로 하는 Order 아이템을 생성하기 위해서는 어떻게 해야할까요?

물론 Shop 아이템의 키를 리턴한다음, Order 아이템의 값들을 Order 오브젝트에 넣어준 후, save() 해야합니다.

이런 일련의 과정을 한번에 해주는 것이 바로, <table_name>_set.create() 입니다. 아래의 예제를 살펴보겠습니다.

shop_item = Shop.objects.get(pk=1)
shop_item.order_set.create(address=address, order_date=order_date)

위의 예제에서 보면, Shop 아이템의 키를 외래키로 하는 Order 아이템을 생성해야하기 때문에 shop_item.order_set.create()을 이용했습니다. 위의 코드가 실행되면, Shop 아이템의 키를 자동으로 받아와, Order 아이템의 외래키로 넣어주게 됩니다.

 

_set을 이용한 예제를 하나 더 살펴보겠습니다.

<table_name>_set.create()을 이용해서 Order 테이블에 Shop 을 외래키로 하는 아이템을 하나 생성하였습니다. 이를 나열해서 보고싶다면, 아래와 같이 _set.all() 함수를 이용하면 됩니다.

shop_item = Shop.objects.get(pk=1)
shop_item.order_set.all()
>>> <QuerySet [<Order: Order object (1)>]>