Django Model Inheritance - атрибуты экземпляра установлены неправильно - PullRequest
1 голос
/ 11 апреля 2020

Увы, мой код работал отлично, пока я не решил «исправить» его, используя наследование для связанных классов.

У меня есть класс UserProgram, который наследуется от Program и MyUser. Когда я изменил определение класса на UserProgram(Program, MyUser), я начал получать странное поведение с моим вызовом UserProgram.objects.get(), который получает свои данные из хранимой процедуры через get_data_pk():

raw('select 1 as id, * from SP_GetUserProgram(%s,%s,%s)', params)

enter image description here

После добавления наследования я вижу, что у новых объектов есть все унаследованные поля, но атрибутам сейчас не присваиваются правильные значения. Например, maxbudget и availablebudget должны быть оба 400000, но это неправильно присвоено uploaddirectoryid и is_active.

enter image description here

Создание объектов 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'
)

1 Ответ

0 голосов
/ 11 апреля 2020

По словам Гомера Симпсона: я такой умный. S ... M ... R ... Т.

Похоже, что мои __init__ функции вызывали проблемы. Я удалил названные параметры и просто оставил *args, **kwargs, и он отлично работает:

def __init__(self,*args,**kwargs):
  super(Program, self).__init__(*args,**kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...