Атрибут pk
Атрибут pk является стандартным способом получения
и установки значения первичного ключа для любой модели
Django. Он автоматически ссылается на поле, объявленное
как первичный ключ (по умолчанию это поле id),
и обеспечивает единый интерфейс для работы с
идентификаторами объектов, независимо от того, какое
поле используется в качестве первичного ключа.
Атрибут доступен как для существующих объектов, так и
для новых экземпляров модели.
Синтаксис
# Получение значения первичного ключа
object.pk
# Установка значения первичного ключа
object.pk = new_value
Пример
Рассмотрим простую модель Article и работу с
атрибутом pk для существующей записи:
from myapp.models import Article
# Получаем статью с id=1
article = Article.objects.get(id=1)
# Получаем значение первичного ключа через pk
print(f"ID статьи: {article.pk}")
print(f"ID через id: {article.id}")
# Меняем значение первичного ключа
article.pk = 10
print(f"Новый ID: {article.pk}")
Результат выполнения кода:
"ID статьи: 1"
"ID через id: 1"
"Новый ID: 10"
Пример
Продемонстрируем использование pk для создания
нового объекта и проверки его состояния:
from myapp.models import Article
# Создаем новую статью
new_article = Article(title="New Article", status="draft")
# Проверяем pk до сохранения
print(f"До сохранения: {new_article.pk}")
# Сохраняем объект
new_article.save()
# Проверяем pk после сохранения
print(f"После сохранения: {new_article.pk}")
Результат выполнения кода:
"До сохранения: None"
"После сохранения: 5"
Пример
Использование pk для фильтрации QuerySet и
получения объектов:
from myapp.models import Article
# Получаем статьи по значению pk
article = Article.objects.get(pk=3)
# Фильтруем статьи по диапазону pk
articles = Article.objects.filter(pk__gte=2, pk__lte=5)
for art in articles:
print(f"Статья {art.pk}: {art.title}")
# Получаем список pk всех статей
pk_list = Article.objects.values_list('pk', flat=True)
print(f"Все pk: {list(pk_list)}")
Результат выполнения кода:
"Статья 2: Django Basics"
"Статья 3: Advanced Models"
"Статья 4: QuerySet Guide"
"Статья 5: ORM Tips"
"Все pk: [1, 2, 3, 4, 5, 6, 7]"
Пример
Работа с pk при использовании кастомного
первичного ключа:
from django.db import models
class Product(models.Model):
sku = models.CharField(max_length=20, primary_key=True)
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
# Создаем продукт с кастомным ключом
product = Product(sku="PROD-001", name="Laptop", price=999.99)
product.save()
# Используем pk для доступа к кастомному ключу
print(f"Product PK: {product.pk}")
print(f"Product SKU: {product.sku}")
# Поиск по pk
found = Product.objects.get(pk="PROD-001")
print(f"Found: {found.name}")
Результат выполнения кода:
"Product PK: PROD-001"
"Product SKU: PROD-001"
"Found: Laptop"