django コア コードのスニペット:
class ForeignKey(RelatedField, Field):
...
def db_type(self, connection):
rel_field = self.rel.get_related_field()
if (isinstance(rel_field, AutoField) or
(not connection.features.related_fields_match_type and
isinstance(rel_field, (PositiveIntegerField,
PositiveSmallIntegerField)))):
return IntegerField().db_type(connection=connection)
return rel_field.db_type(connection=connection)
から継承するカスタム フィールドを定義するとAutoField
、db_type メソッドが無視されるため、このコードは非常に不適切です。
私がやりたいことは、私のクラスが のインスタンスであるという事実を隠すことですAutoField
。C++ では、プライベート継承によってそれを行います。
isinstance
継承を返すFalse
か隠す方法はありますか?
私のカスタムフィールドのコード:
class MyAutoField(models.AutoField):
def __init__(self, length, *args, **kwargs):
self.length = length
super(MyAutoField, self).__init__(*args, **kwargs)
def db_type(self, connection):
if connection.vendor == 'oracle':
return 'NUMBER(%s,0)' % (self.length)
if connection.vendor == 'postgresql':
if self.length <= 4:
return 'smallint'
if self.length <= 9:
return 'integer'
return 'bigint'
return super(MyAutoField, self).db_type(connection)