Увы, мой код работал отлично, пока я не решил «исправить» его, используя наследование для связанных классов.
У меня есть класс UserProgram
, который наследуется от Program
и MyUser
. Когда я изменил определение класса на UserProgram(Program, MyUser)
, я начал получать странное поведение с моим вызовом UserProgram.objects.get()
, который получает свои данные из хранимой процедуры через get_data_pk()
:
raw('select 1 as id, * from SP_GetUserProgram(%s,%s,%s)', params)
После добавления наследования я вижу, что у новых объектов есть все унаследованные поля, но атрибутам сейчас не присваиваются правильные значения. Например, maxbudget
и availablebudget
должны быть оба 400000
, но это неправильно присвоено uploaddirectoryid
и is_active
.
Создание объектов UserProgram
вручную через UserProgram(...)
работает нормально, но не через вызов БД. Я не уверен, что происходит. Любые идеи? Вот упрощенная версия моего кода.
models.py
class UserProgramManager(models.Manager):
def get(self, userid, programname, schoolyear):
return get_data_pk(self,
'SP_GetUserProgram(%s,%s,%s)', (userid, programname, schoolyear)
)
class MyModel(models.Model):
class Meta:
managed = False
abstract = True
class MyUser(AbstractBaseUser):
userid = models.IntegerField(primary_key=True)
objects = MyUserManager()
class Program(MyModel):
programname = models.CharField(primary_key=True)
schoolyear = models.SmallIntegerField()
def __init__(self,schoolyear=None,programname=None,*args,**kwargs):
super(Program, self).__init__(*args,**kwargs)
self.schoolyear = schoolyear
self.programname = programname
# Do some extra processing (not included here)
class UserProgram(Program, MyUser):
uploaddirectoryid = models.CharField(primary_key=True)
objects = UserProgramManager()
test.py
# Works fine
myuserprogram = UserProgram(
userid=17,
schoolyear=2020,
programname='incentive'
)
# Attributes are not set correctly
myuserprogram = UserProgram.objects.get(
userid=17,
schoolyear=2020,
programname='incentive'
)