Поле AutoField

Поле AutoField представляет собой целочисленное поле, значение которого автоматически увеличивается при добавлении новой записи в базу данных. Оно чаще всего используется в качестве первичного ключа модели, хотя не является обязательным, если вы явно указываете другое поле. По умолчанию Django автоматически добавляет поле с типом BigAutoField, начиная с версии 3.2, однако в более старых проектах часто используется AutoField, поэтому понимание его работы необходимо для поддержки существующего кода.

При определении поля в модели конструктор принимает стандартные параметры, такие как primary_key, verbose_name, db_column и другие. Если поле не указано как первичный ключ, Django автоматически создаст скрытое поле id, но если вы установите primary_key=True для любого поля, то автоматическое поле не будет создано.

Синтаксис

pythonfrom django.db import models

class YourModel(models.Model):
  id = models.AutoField(primary_key=True)

Пример

Рассмотрим простейшую модель категории, где поле id является первичным ключом с автоматическим приращением:

pythonfrom django.db import models

class Category(models.Model):
  id = models.AutoField(primary_key=True)
  name = models.CharField(max_length=100)

  def __str__(self):
    return self.name

Теперь создадим несколько категорий и посмотрим, как назначаются значения поля id:

pythonfrom myapp.models import Category

cat1 = Category.objects.create(name="Technology")
cat2 = Category.objects.create(name="Science")
cat3 = Category.objects.create(name="Art")

for cat in Category.objects.all():
  print(f"{cat.id}: {cat.name}")

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

python"1: Technology"
"2: Science"
"3: Art"

Пример

Если вы не используете явно поле AutoField, Django все равно создаст неявное поле с именем id для хранения первичного ключа. Рассмотрим модель статьи без явного указания первичного ключа:

pythonfrom django.db import models

class Article(models.Model):
  title = models.CharField(max_length=200)
  content = models.TextField()

  def __str__(self):
    return self.title

В данном случае Django автоматически добавит поле id типа AutoField. Вы можете обращаться к нему как к обычному полю:

pythonfrom myapp.models import Article

article = Article.objects.create(
  title="Django Basics",
  content="An introduction to Django."
)

print(article.id)
print(article.pk)

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

python"1"
"1"

Пример

Поле AutoField можно использовать в качестве внешнего ключа. Рассмотрим модель комментария, которая ссылается на статью:

pythonfrom django.db import models

class Article(models.Model):
  id = models.AutoField(primary_key=True)
  title = models.CharField(max_length=200)

class Comment(models.Model):
  id = models.AutoField(primary_key=True)
  article = models.ForeignKey(Article, on_delete=models.CASCADE)
  text = models.TextField()

Теперь создадим статью и несколько комментариев к ней:

pythonfrom myapp.models import Article, Comment

article = Article.objects.create(title="Web Development")
Comment.objects.create(article=article, text="Great article!")
Comment.objects.create(article=article, text="Very useful.")

for comment in Comment.objects.all():
  print(f"Comment {comment.id} for article {comment.article.id}")

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

python"Comment 1 for article 1"
"Comment 2 for article 1"

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

  • поле BigAutoField,
    которое использует 64-битное целое число для хранения значений
  • поле SmallAutoField,
    которое использует 16-битное целое число для хранения значений
  • поле IntegerField,
    которое хранит целые числа без автоматического приращения
  • атрибут pk,
    который возвращает значение первичного ключа модели