Поле AutoField
Поле AutoField представляет собой целочисленное поле, значение которого автоматически увеличивается при добавлении новой записи в базу данных. Оно чаще всего используется в качестве первичного ключа модели, хотя не является обязательным, если вы явно указываете другое поле. По умолчанию Django автоматически добавляет поле с типом BigAutoField, начиная с версии 3.2, однако в более старых проектах часто используется AutoField, поэтому понимание его работы необходимо для поддержки существующего кода.
При определении поля в модели конструктор принимает стандартные параметры, такие как primary_key, verbose_name, db_column и другие. Если поле не указано как первичный ключ, Django автоматически создаст скрытое поле id, но если вы установите primary_key=True для любого поля, то автоматическое поле не будет создано.
Синтаксис
from django.db import models
class YourModel(models.Model):
id = models.AutoField(primary_key=True)
Пример
Рассмотрим простейшую модель категории, где поле id является первичным ключом с автоматическим приращением:
from 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:
from 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}")
Результат выполнения кода:
"1: Technology"
"2: Science"
"3: Art"
Пример
Если вы не используете явно поле AutoField, Django все равно создаст неявное поле с именем id для хранения первичного ключа. Рассмотрим модель статьи без явного указания первичного ключа:
from 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. Вы можете обращаться к нему как к обычному полю:
from myapp.models import Article
article = Article.objects.create(
title="Django Basics",
content="An introduction to Django."
)
print(article.id)
print(article.pk)
Результат выполнения кода:
"1"
"1"
Пример
Поле AutoField можно использовать в качестве внешнего ключа. Рассмотрим модель комментария, которая ссылается на статью:
from 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()
Теперь создадим статью и несколько комментариев к ней:
from 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}")
Результат выполнения кода:
"Comment 1 for article 1"
"Comment 2 for article 1"
Смотрите также
-
поле
BigAutoField,
которое использует 64-битное целое число для хранения значений -
поле
SmallAutoField,
которое использует 16-битное целое число для хранения значений -
поле
IntegerField,
которое хранит целые числа без автоматического приращения -
атрибут
pk,
который возвращает значение первичного ключа модели