Можно ли использовать UUIDField как default_auto_field в Django 3.2. ^?

Я использовал UUIDField в качестве основного ключа в Django. В моем проекте есть иерархия моделей с унаследованными полями, и наверху у меня есть следующий суперкласс:

      import uuid
from django.db import models

class HasIDMixin(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, name='id')

После обновления до Django 3.2.4 я получаю следующее предупреждение:

      WARNINGS:
app_base.MyProject: (models.W042) Auto-created primary key used when not defining a primary key type, by default 'django.db.models.AutoField'.
    HINT: Configure the DEFAULT_AUTO_FIELD setting or the AppBaseConfig.default_auto_field attribute to point to a subclass of AutoField, e.g. 'django.db.models.BigAutoField'.

Следуя совету предупреждения, я попробовал как DEFAULT_AUTO_FIELD в settings.py, так и default_auto_field в app_config, и получил следующую ошибку:

      ValueError: Primary key 'django.db.models.UUIDField' referred by DEFAULT_AUTO_FIELD must subclass AutoField.

Я видел, как другие подходили к этой проблеме с помощью настраиваемого дочернего класса как для UUIDField, так и для AutoField (https://code.djangoproject.com/ticket/32577), но рабочего решения не было опубликовано. Возможно ли это в настоящее время в Django 3.2.^? Если нет, мне следует найти другое решение для первичного ключа или выполнить откат?

1 ответ

Решение

Если не задано поле модели как первичный ключ для этой модели, Django автоматически добавит поле в вашу модель с именем idкоторый будет использоваться в качестве первичного ключа. Обычно это автоматически добавляемый ключ. Начиная с Django 3.2 и далее, Django позволяет вам указать, какой тип AutoField будет использоваться для этих автоматически сгенерированных полей первичного ключа путем установки.

Учитывая, что вы явно задали первичный ключ для своей модели, Django не будет генерировать для него поле. Но все же вы должны указать, поскольку у вас может быть какая-то модель, в которой вы не указываете первичный ключ. Вы можете безопасно сохранить свой UUIDField в вашей модели как есть, а также установите DEFAULT_AUTO_FIELD вот так:

      DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' # Or one of the other options as per your choice
Другие вопросы по тегам