Краткий ответ : используйте взамен AutoField
или не указывайте первичный ключ вообще: Django автоматически создаст один с именем id
.
Вы делаете круговой импорт здесь: ваш модуль models
зависит от вашего validators
, и наоборот.
Однако вы можете лениво загрузить модуль models
, импортировав его вincrement_id
:
# app/validators.py
from django.core.exceptions import ValidationError
def increment_id():
<b>from .models import Branch</b>
last_branch_id = Branch.objects.all().order_by(<b>'BranchId'</b>).last().<b>BranchId</b>
new_branch_id = last_branch_id + 1
return new_branch_id
В ваших моделях вы можете работать с:
# app/models.py
class Branch(models.Model):
branchID = models.PositiveSmallIntegerField(primary_key=True, serialize=True, <b>default=increment_id</b>)
Обратите внимание, что это не валидатор, вы здесьиметь значение по умолчанию.Более того, вы должны , а не написать: Django имеет AutoField
[Django-doc] , что:
IntegerField, которое автоматически увеличивает в соответствии с доступными идентификаторами.Вам обычно не нужно использовать это напрямую ;поле первичного ключа будет автоматически добавлено в вашу модель, если вы не укажете иное.См. Автоматические поля первичного ключа.
Таким образом, вы можете лучше определить это как:
class Branch(models.Model):
<b>branch_id</b> = <b>models.AutoField(primary_key=True)</b>
# ...
В соответствии с Руководством по стилю PEP-8 Кроме того, рекомендуется именовать атрибуты с помощью lowercase_with_underscores
, поэтому branch_id
вместо branchId
.
Кроме того, обычно нет смысла называть именапервичный ключ, отличный от id
.Приставив префикс к branch_id
, вы можете меньше использовать duck, набрав .Так что, возможно, было бы лучше полностью пропустить это поле, поскольку документация по Полям автоматического первичного ключа говорит :
По умолчанию Django даеткаждая модель имеет следующее поле :
id = models.AutoField(primary_key=True)
Это первичный ключ с автоинкрементом.
Если вы хотите указать настраиваемый первичный ключ, просто укажите primary_key=True
на одном из ваших полей.Если Django видит , который вы явно задали Field.primary_key
, он не добавит автоматический id
столбец .
Так что, если у вас нетхорошая причина указать один из них, вы можете просто перечислить столбцы данных:
class Branch(models.Model):
# ...
# other non-pk fields