表題のことを実装しようとして
ここ に記載のある方法でカスタムフィールドモデルを作ったら
エラーが出て動きませんでした。
上記URLに記載されている例は以下の通り。(抜粋です)
# This is a much more flexible example.
class BetterCharField(models.Field):
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length
super().__init__(*args, **kwargs)
def db_type(self, connection):
return 'char(%s)' % self.max_length
# In the model:
class MyModel(models.Model):
# ...
my_field = BetterCharField(25)
この通りに作ると、
TypeError: __init__() got multiple values for argument 'max_length'
と怒られます。
結局、私はkwargsからmax_lengthを拾って対応しました。
以下、動いたソースです。
※ 共通で使用するカスタマイズをbase(仮)という名前でパッケージ化しています。
※ 参考までにほぼそのまま抜き出してきました。
# base/models.py
from django.db import models
class MySQLCharField(models.Field):
def __init__(self, *args, **kwargs):
if kwargs.get('max_length'):
self.max_length = kwargs.get('max_length')
super(MySQLCharField, self).__init__(*args, **kwargs)
def db_type(self, connection):
if connection.settings_dict['ENGINE'] == 'django.db.backends.mysql':
return 'char(%s)' % self.max_length
else:
return 'varchar'
# test.py
from base import models as custom_models
class Test(models.Model):
code = custom_models.MySQLCharField(_('code'), max_length=2, primary_key=True)
上記例はPKですが、基本、int(11) auto_incrementで作っています。
でも、コードマスタ作りたいときがあるんですよね。
ご参考になれば幸いです。
それちがう、わかりづらい等あればご指摘ください🙇🏻♀️