モデルの1つにDjangoカスタムフィールド「BigAutoField」があります。これは主キーではありません。主キーとしてuuidを使用しています。挿入すると、すべてが正常に機能しています。このフィールドの値が自動的にインクリメントされた新しいエントリをmysqlデータベースに取得しています。ただし、問題は、保存後、モデルインスタンスがこのフィールドの値をフェッチできないことです。(ドット表記は機能しません)。その値にアクセスするには、オブジェクトインスタンスを再度フェッチする必要があります。誰かがリロードせずに値にアクセスする方法を教えてもらえますか?
class BigAutoField(models.PositiveIntegerField):
__metaclass__ = models.SubfieldBase
def __init__(self, *args, **kwargs):
self.sequence_name = kwargs.pop('sequence_name', None)
kwargs['blank'] = True
kwargs['editable'] = False
kwargs['null'] = False
kwargs['unique'] = True
super(BigAutoField, self).__init__(*args, **kwargs)
def db_type(self, connection):
engine = settings.DATABASE_ENGINE
if engine[-5:] == 'mysql':
return 'bigint AUTO_INCREMENT'
elif engine == 'oracle':
return 'NUMBER(19)'
elif engine[:8] == 'postgres':
return 'bigserial'
else:
raise NotImplemented()
def get_internal_type(self):
return 'BigAutoField'
def to_python(self, value):
if value is None:
return value
try:
return long(value)
except (TypeError, ValueError):
raise exceptions.ValidationError(
_("This value must be a long integer."))
def get_db_prep_value(self, value, connection=None, prepared=False):
if value is None:
return value
return long(value)
これは私のカスタムbigautofieldクラスです。このフィールドを使用してモデルの保存を初めて実行すると、正常に機能します。
x= XYZ.objects.create(a='a',b='b')
x.save()
しかし、現在、cがXYZのBigAutoFieldであるxcにアクセスできません。mysqlデータベースでは、同じものの自動インクリメントされた値が表示されますが。