Django IntegerField не работает в качестве primary_key, когда CharField работает для неуправляемой модели, использующей пользовательский DbManager
Работа с Django5.0 при обновлении старой базы данных oracle с несколькими базами данных/схемами.
class OtherDbManager(models.Manager):
def get_queryset(self):
odb = "default"
if hasattr(self.model, 'my_db'):
odb = self.model.my_db
return super().get_queryset().using(odb)
class AAAModel(models.Model):
class Meta:
managed = False
abstract = True
objects = OtherDbManager()
class BBBModel(AAAModel):
class Meta(AAAModel.Meta):
managed = False
abstract = True
my_db = 'bbb_db'
class WackyObj(BBBModel):
class Meta(BBBModel.Meta):
managed = False
db_table = '"%s"."%s"' % ("BBB_DB", "WACKY_OBJ")
#myinteger = models.IntegerField(primary_key=True, null=False)
#queryset operations fail if this is an integer field
myinteger = models.CharField(primary_key=True, null=False)
available_on = models.DateField()
В основной таблице Oracle «WACKY_OBJ» файл MYINTEGER имеет значение NUMBER, NOT NULL.
Теперь, если я сделаю что-то вроде:
target = WackyObj.objects.get(myinteger=8675309)
я получу обратно свой объект, но если я использую вместо него IntegerField (закомментировано в определении класса WackyObj выше):
target = WackyObj.objects.get(myinteger=8675309)
я получу:
wackymod.models.WackyObj.DoesNotExist: WackyObj matching query does not exist.
Это ошибка?
Кроме того, если это имеет значение, я использую DatabaseRouter следующим образом:
from wackymod.models import AAAModel
class XXXRouter:
def db_for_read(self, model, **hints):
if issubclass(model, AAAModel):
return model.my_db
return None
def db_for_write(self, model, **hints):
if issubclass(model, AAAModel):
return model.my_db
return None
def allow_relation(self, obj1, obj2, **hints):
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
return False
Как показано выше, я пытался заставить его работать с IntegerField, используя различные способы цитирования таблицы с двойными кавычками и без них, а также имя базы данных.