LoginSignup
0
1

More than 5 years have passed since last update.

DjangoでMySQLのChar型を実装する

Last updated at Posted at 2019-02-21

表題のことを実装しようとして

ここ に記載のある方法でカスタムフィールドモデルを作ったら

エラーが出て動きませんでした。

上記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で作っています。
でも、コードマスタ作りたいときがあるんですよね。

ご参考になれば幸いです。

それちがう、わかりづらい等あればご指摘ください🙇🏻‍♀️

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1