Automatic primary key 필드
기본적으로 장고는 각각 모델에 아래 필드를 준다.
xxxxxxxxxx
id = models.AutoField(primary_key=True)
이것은 자동 증가하는 primary key
이다.
만약 당신이 custom primary key 설정을 원한다면, primary=True
를 당신의 필드에 설정해주어야 한다
만약 장고가 명시적으로 Field.primary_key
를 당신이 세팅한 것을 알게된다면, 이것은 자동으로 생성되는 id 컬럼을 추가하지 않을 것이다.
각각 모델은 primary_key=True
를 가진 필드가 정확하게 1개 이길 요구한다.(명시적으로 선언 하거나, 자동적으로 생성되거나 둘중에 하나)
내 마음대로 해설
위의 내용은 간단하다
1.각 모델 마다 pk는 자동 생성된다.(id)
2.만약에 명시적으로 지정해주고 싶으면 primary_key=True
를 붙여줘라
1, 2번 각각을 아래와 같이 확인해 볼 수 있다.
1.Model에 id가 없는 경우 자동 생성됨
xxxxxxxxxx
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
위와 같은 모델이 있을 때, migration을 생성한 이후에, python manage.py sqlmigrate [앱] [migration 번호]
를 치면, 아래 와 같이 쿼리가 발생한다.
xxxxxxxxxx
//sqlite 기준
BEGIN;
--
-- Create model Person
--
CREATE TABLE "thkwon_lab_person" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL);
COMMIT;
위에서 보다 시피, 모델 상에선 id 가 없지만, 생성 쿼리 내에는 id 가 pk 로 지정된 것을 확인할 수 있다.
2.primary_key=True
로 명시해준 경우, 해당 필드가 PK가 됨
xxxxxxxxxx
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
phone_number = models.CharField(max_length=40, unique=True, primary_key=True)
phone_number
필드에 primary_key
를 추가하고 True로 세팅
위와 같이 python manage.py sqlmigrate [앱] [migration 번호]
를 치면, 아래 와 같이 쿼리가 발생한다.
xxxxxxxxxx
//sqlite 기준
BEGIN;
--
-- Create model Person
--
CREATE TABLE "thkwon_lab_person" ("first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL, "phone_number" varchar(40) NOT NULL PRIMARY KEY);
COMMIT;
위 쿼리와 달리 phone_nubmer
에 PK가 지정된 것을 확인할 수 있다.
'개발 > 장고' 카테고리의 다른 글
[해설과 함께 읽는 Django 문서] Models - 다 대 다 관계 (0) | 2021.01.29 |
---|---|
[해설과 함께 읽는 Django 문서] Models - 다 대 일 관계 (0) | 2021.01.27 |
[해설과 함께 읽는 Django 문서] Models - Verbose Field 이름 (0) | 2021.01.24 |
[해설과 함께 읽는 Django 문서] Models - 필드옵션 (0) | 2021.01.23 |
[해설과 함께 읽는 Django 문서] Models - Quick example, Using models (0) | 2021.01.20 |