Django - ORM self reference, 복합 필드로 중복 키 지정

자기 자신의 레코드 중에 하나를 Foreign Key 로 등록하는 경우와 필드를 합쳐서 중복이 생기지 않도록 설정하는 방법을 알아보자.

 

길게 설명이 필요없다. 그냥 아래 예제로 끝

class PartsGroup(models.Model):
    name = models.CharField(max_length=256, verbose_name="Name")
    level = models.CharField(max_length=1, default="0", verbose_name="Level", null=True, blank=True)
    parent = models.ForeignKey("self", on_delete=models.PROTECT, verbose_name="Parent", null=True, blank=True)
    updated_at = models.DateTimeField(auto_now=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True, null=True)

    class Meta:
        constraints = [models.UniqueConstraint(fields=["name", "level"], name="partsgroup-name-unique")]

    def __str__(self):
        return f"{self.name}"

 

ForeignKey("self", ... ) 

이렇게 하면 자기 테이블 내에서 외부키를 지정할 수 있다.

 

class Meta 에서

name, level 필드를 합쳐서 중복이 없도록 설정하는 방법을 예제로 추가했다.

 

즉, name 만으로 중복 안되도록 unique를 주게 되면 다른 level 에 동일한 이름을 쓸 수가 없는데, 이렇게 해주면 level이 같은 놈들끼 name이 중복 안되록 해 주게 되므로 편리하게 활용할 수 있다. 

 

오늘 팁은 여기까징

스위스 루체른 이런데로 가고싶당

Bhuwan Dhingra 님의 사진, 출처: Pexels