Django 쿼리 - id vs pk
Django ORM에서 id와 pk는 모두 동일한 값을 참조하는 데 사용되는 약어이지만, 약간의 차이점이 있습니다.
id는 Django가 자동으로 생성하는 데이터베이스 테이블의 각 레코드에 대한 고유 식별자입니다. 일반적으로 AutoField 필드를 사용하여 생성됩니다. id는 int 형식이며, 테이블 내에서 레코드를 식별하는 데 사용됩니다.
pk는 primary key의 약어이며, 테이블 내에서 레코드를 고유하게 식별하는 데 사용되는 하나 이상의 필드를 나타냅니다. pk는 id와 동일한 값을 가질 수도 있지만, 여러 필드로 구성된 복합 키일 수도 있습니다.
예시:
class Book(models.Model):
title = models.CharField(max_length=255)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
publication_date = models.DateField()
이 예시에서 Book 모델은 id 필드를 가지고 있으며, 이 필드는 자동으로 생성된 고유 식별자입니다. 또한 Book 모델은 author 필드를 가지고 있으며, 이 필드는 Author 모델의 외래 키입니다. author 필드는 Book 모델의 레코드를 고유하게 식별하는 데 사용될 수 있는 pk로 간주될 수 있습니다.
일반적으로 다음과 같은 경우에 pk를 사용하는 것이 좋습니다:
- 테이블 내에서 특정 레코드를 참조해야 할 때
- 쿼리에서 여러 테이블을 조인해야 할 때
- 객체를 삭제하거나 업데이트해야 할 때
id는 다음과 같은 경우에 사용하는 것이 좋습니다:**
- 테이블 내에서 레코드의 순서를 나타내야 할 때
- 객체를 생성할 때
요약:
- id는 Django가 자동으로 생성하는 고유 식별자입니다.
- pk는 테이블 내에서 레코드를 고유하게 식별하는 데 사용되는 하나 이상의 필드를 나타냅니다.
- 일반적으로 pk를 사용하는 것이 좋습니다.
- id는 특정 상황에서 사용하는 것이 좋습니다.
Django 쿼리 - id vs pk 예제 코드
예제 1: 특정 레코드 참조하기
book = Book.objects.get(pk=1)
print(book.title) # "The Lord of the Rings" 출력
이 예시에서는 pk를 사용하여 Book 모델의 ID가 1인 레코드를 가져옵니다.
예제 2: 쿼리에서 여러 테이블 조인하기
author = Author.objects.get(name="J.R.R. Tolkien")
books = author.book_set.all()
for book in books:
print(book.title)
이 예시에서는 pk를 사용하여 Author 모델의 이름이 "J.R.R. Tolkien"인 레코드를 가져옵니다. 그런 다음 book_set 관계를 사용하여 해당 저자의 모든 책을 가져옵니다.
예제 3: 객체 삭제하기
book = Book.objects.get(pk=1)
book.delete()
예제 4: 객체 업데이트하기
book = Book.objects.get(pk=1)
book.title = "The Hobbit"
book.save()
이 예시에서는 pk를 사용하여 Book 모델의 ID가 1인 레코드를 가져옵니다. 그런 다음 title 필드를 "The Hobbit"으로 업데이트하고 변경 사항을 저장합니다.
예제 5: 테이블 내에서 레코드 순서 나타내기
books = Book.objects.order_by('id')
for book in books:
print(book.title)
이 예시에서는 id를 사용하여 Book 모델의 모든 레코드를 ID 순서대로 가져옵니다.
book = Book(title="The Silmarillion", author=author)
book.save()
이 예시에서는 id가 자동으로 생성되는 Book 모델의 새 레코드를 만듭니다.
- 이 예제 코드는 Django ORM의 기본적인 기능만 보여줍니다. Django ORM에는 더 많은 기능이 있습니다.
Django 쿼리 - id 대신 pk를 사용하는 대체 방법
id를 사용하는 대체 방법:
- get_by_natural_key() 메서드 사용: 일부 모델은
get_by_natural_key()
메서드를 제공합니다. 이 메서드는 모델의 고유 식별자를 식별하는 데 사용되는 하나 이상의 필드를 사용하여 레코드를 가져옵니다. 예를 들어 다음과 같이 사용할 수 있습니다.
book = Book.objects.get_by_natural_key(title="The Lord of the Rings")
print(book.title) # "The Lord of the Rings" 출력
- filter() 메서드 사용:
filter()
메서드를 사용하여 id 필드를 기준으로 레코드를 필터링할 수 있습니다. 예를 들어 다음과 같이 사용할 수 있습니다.
books = Book.objects.filter(id=1)
for book in books:
print(book.title) # "The Lord of the Rings" 출력
주의 사항:
- id를 사용하는 것은 일반적으로 권장되지 않습니다. id는 테이블 내에서 레코드의 순서를 나타내는 데 사용되며, 이 순서는 변경될 수 있습니다. pk는 테이블 내에서 레코드를 고유하게 식별하는 데 사용되는 하나 이상의 필드로 구성되며, 이 필드는 변경되지 않습니다.
- id를 사용하면 쿼리가 느려질 수 있습니다. Django는 pk를 사용하여 테이블 내에서 레코드를 빠르게 찾을 수 있지만, id를 사용하면 테이블 전체를 검색해야 할 수도 있습니다.
- 일부 특수한 경우에는 id를 사용하는 것이 더 적합할 수 있습니다.
- id를 사용하기 전에 주의 사항을 확인하십시오.
django orm primary-key