장고 자기 참조 외래 키


166

나는 일반적으로 webapps 및 데이터베이스에 익숙하지 않으므로 이것이 멍청한 질문 일 수 있습니다. 모델의 다른 인스턴스 (부모)의 기본 ID를 가리키는 필드로 모델 ( "CategoryModel")을 만들고 싶습니다.

class CategoryModel(models.Model):
    parent = models.ForeignKey(CategoryModel)

어떻게해야합니까? 감사!


2
문체는,이 호출 제안 parent대신 parentId이후 my_category_model.parent의 인스턴스가 될 것입니다 CategoryModel. Django는 parent_id관련 모델의 기본 키가 될 멤버 를 자동으로 만듭니다 .
10flow

답변:


263

모델 이름을 ForeignKey에 문자열로 전달하면 올바른 작업을 수행합니다.

그래서:

parent = models.ForeignKey("CategoryModel")

또는 "self"라는 문자열을 사용할 수 있습니다

parent = models.ForeignKey("self")

55

'self'문자열을 사용하여 자체 참조를 표시 할 수 있습니다.

class CategoryModel(models.Model):
    parent = models.ForeignKey('self')

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey


7
나는 당신이 '자신'을 의미한다고 생각합니다. 문자열에서와 같이. 이 맥락에서 자아는 정의되지
Jared Forsyth

1
@Brandon 귀하의 답변에서 '자기'는 그의 의견에서 자레드가 말한 것과 어떻게 다릅니 까? "나는 당신이 '자신을 의미하는 것 같아요'!!! . 둘 다 장고 문서에 따르면 문자열입니다. ! 모든 힌트
Stryker

1
차이점은 self모델 속성을 정의 할 때 존재하지 않는다는 것입니다. 프로퍼티가 __init__()다른 메소드의 일부로 정의 된 경우, self항상 파이썬 클래스의 인스턴스 메소드에 대한 첫 번째 위치 인수와 같습니다.
Brandon


1

또한 null = True 및 blank = True를 설정해야합니다.

class CategoryModel(models.Model):
    parent = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True)

null = True, 데이터베이스에서 허용
blank = True, 양식 유효성 검사에서 허용

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.