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, используя различные способы цитирования таблицы с двойными кавычками и без них, а также имя базы данных.

Вернуться на верх