Атрибут pk

Атрибут pk является стандартным способом получения и установки значения первичного ключа для любой модели Django. Он автоматически ссылается на поле, объявленное как первичный ключ (по умолчанию это поле id), и обеспечивает единый интерфейс для работы с идентификаторами объектов, независимо от того, какое поле используется в качестве первичного ключа. Атрибут доступен как для существующих объектов, так и для новых экземпляров модели.

Синтаксис

python# Получение значения первичного ключа
object.pk

# Установка значения первичного ключа
object.pk = new_value

Пример

Рассмотрим простую модель Article и работу с атрибутом pk для существующей записи:

pythonfrom 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}")

Результат выполнения кода:

python"ID статьи: 1"
"ID через id: 1"
"Новый ID: 10"

Пример

Продемонстрируем использование pk для создания нового объекта и проверки его состояния:

pythonfrom 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}")

Результат выполнения кода:

python"До сохранения: None"
"После сохранения: 5"

Пример

Использование pk для фильтрации QuerySet и получения объектов:

pythonfrom 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)}")

Результат выполнения кода:

python"Статья 2: Django Basics"
"Статья 3: Advanced Models"
"Статья 4: QuerySet Guide"
"Статья 5: ORM Tips"
"Все pk: [1, 2, 3, 4, 5, 6, 7]"

Пример

Работа с pk при использовании кастомного первичного ключа:

pythonfrom 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}")

Результат выполнения кода:

python"Product PK: PROD-001"
"Product SKU: PROD-001"
"Found: Laptop"

Смотрите также

  • поле AutoField,
    которое автоматически генерирует числовые идентификаторы
  • поле UUIDField,
    которое используется для уникальных идентификаторов
  • поле CharField,
    которое может выступать в качестве первичного ключа
  • метод filter,
    который позволяет фильтровать записи по значению pk