フィールドの実際のタイプはバックエンドで指定されます。MySQL の場合、バックエンドはdjango.db.backends.mysql
. この抜粋django/db/backends/mysql/creation.py
は、この翻訳を示しています。
class DatabaseCreation(BaseDatabaseCreation):
# This dictionary maps Field objects to their associated MySQL column
# types, as strings. Column-type strings can contain format strings; they'll
# be interpolated against the values of Field.__dict__ before being output.
# If a column type is set to None, it won't be included in the output.
data_types = {
'AutoField': 'integer AUTO_INCREMENT',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
...
これを変更するには、次のようにして、この dict にモンキー パッチを適用する必要があります。
from django.db.backends.mysql.creation import DatabaseCreation
DatabaseCreation.data_types['AutoField'] = 'integer UNSIGNED AUTO_INCREMENT'
または、独自のクラスを作成して、他のクラスを台無しにしないようにしますAutoFields
。
from django.db.models.fields import AutoField
class UnsignedAutoField(AutoField):
def get_internal_type(self):
return 'UnsignedAutoField'
from django.db.backends.mysql.creation import DatabaseCreation
DatabaseCreation.data_types['UnsignedAutoField'] = 'integer UNSIGNED AUTO_INCREMENT'
そして、独自の PK を作成します。
id = UnsignedAutoField()
から派生AutoField
するため、すべての動作を継承します。