Как установить BinaryField в качестве первичного ключа в django?

В этом коде у меня есть:

IDChuyenBien = models.BinaryField(primary_key=True, max_length=8)

Но когда я делаю миграции и мигрирую, возникает ошибка: _mysql.connection.query(self, query) django.db.utils.OperationalError: (1170, "BLOB/TEXT столбец 'IDChuyenBien' использован в спецификации ключа без длины ключа")
Хотя я использовал max_length, как указано выше, я использую Django 4.2.9 для подключения к Mysql

Я следовал документам следующим образом: https://docs.djangoproject.com/en/4.2/ref/models/fields/.
Я также пытался придумать несколько других способов, но все еще не нашел решения, потому что требуется, чтобы передаваемые данные были двоичными и сохранялись непосредственно в базе данных, а до этого, когда я не использовал первичный ключ, в mysql при миграции он также был LONGBLOB. А сейчас нужен только тип BINARY с 8 или 10 байтами

TLDR: на момент написания статьи вы не можете установить BinaryField в качестве первичного ключа.

Django does not take the length of the field to the SQL database, it is only used to validate items internally. This thus means that for MySQL, it will use a longblob, for Oracle a BLOB, for PostgreSQL a bytea and for SQLite a BLOB. Indeed, as we see for example for MySQL [GitHub]:

"BinaryField": "longblob",
"BooleanField": "bool",
"CharField": "varchar(%(max_length)s)",

Так, в данном случае BinaryField в MySQL переводится как longblob, а для CharField выбирается varchar(…), но уточняется длина.

Таким образом, это поле не передается бэкенду базы данных, и поэтому вы не можете использовать его в качестве первичного ключа, так как только для небольших блобов оно выполняет хеширование.

That being said, it is probably not a good idea to use a BinaryField in the first place. In fact, in Django an using an AutoField is the norm, and one can then use for example GenericForeignKey fields [Django-doc] that exploits the fact that primary keys are uniform.

Я бы не советовал использовать BinaryField в качестве первичного ключа. Я рекомендую, основываясь на лучших практиках выбора первичных ключей для вашей таблицы:

  1. Первичный ключ должен быть уникальным и сохранять это ограничение неизменным с течением времени.

  2. Рекомендуется, чтобы, по возможности, первичный ключ не вводился непосредственно пользователем. Это помогает обеспечить согласованность и целостность.

  3. Использование автоинкрементирующего первичного ключа в основном предпочтительнее, так как он обеспечивает большую гибкость и имеет меньшую временную сложность операций.

Если вы хотите использовать BinaryField, то существует большая вероятность встретить дубликаты, что может повлиять на уникальность.

Кроме того, хранение двоичных данных занимает больше места в базе данных и требует больше времени и ресурсов для выполнения операций, особенно при работе с большими объемами данных.

Вернуться на верх