Django: наследование нескольких таблиц не позволяет мне получить доступ к производному классу из базового класса - PullRequest
0 голосов
/ 24 января 2012

Я хочу получить производный экземпляр класса модели из экземпляра базовой модели.

У меня есть следующая иерархия классов моделей:

class AlfrescoPFCModel(models.Model):
    #some fields and methods
    class Meta:
        abstract = True


class Contenido(AlfrescoPFCModel):
    #some fields and methods

class Proyecto(Contenido):
    #some fields and methods

class ProyectoCalificado(Proyecto):
    #some fields and methods

class ProyectoArchivado(ProyectoCalificado):
    #some fields and methods

И я создаю экземпляр класса Proyecto следующим образом:

proyecto = proyecto_form.save(commit=False)
#do some stuff with some fields that dont appear on the form
proyecto.save

В другом представлении я пытаюсь получить доступ к производному классу ProyectoCalificado из базового класса Proyecto, который ранее был создан и сохранен в базе данных, выполнив:

pc = ProyectoCalificado.objects.get(pk=id)

и я получаю: Соответствующий запрос ProyectoCalificado не существует.

Я тоже пробовал:

p = get_object_or_404(Proyecto, id=id)
pc = p.proyectocalificado

но он получает ту же ошибку во второй строке.

Читая документацию, я должен иметь возможность сделать это: # мульти-стол наследование

То, что я хочу сделать, это постепенно завершать данные, связанные с Proyecto (проектом), следуя этому рабочему процессу: Proyecto -> ProyectoCalificado -> ProyectoArchivado. У меня есть 3 разные формы для каждого шага. Мне нужны 3 разные модели, потому что мне нужно сохранить их в базе данных, не заполняя сразу все обязательные поля.

Спасибо!

Ответы [ 2 ]

1 голос
/ 24 января 2012

Используйте мастера форм (https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/).

ОБНОВЛЕНИЕ

Если вы не можете использовать мастера форм из-за описанной вами ситуации, то вам следует создать моделиполя пустые или обнуляемые на уровне базы данных , а затем только принудительно устанавливают требования к полям для каждой отдельной формы .Создание трех уровней наследования исключительно для единовременного набора форм, необходимых для его создания, является абсолютно неправильнымподход. Он только фрагментирует ваши данные в дополнительных таблицах и делает запрос более сложным без долгосрочной выгоды.

Так, например. Настройте саму модель как на ничто (или только элементы в первой форме).). Затем в вашей первой форме заполните только поля, необходимые для этого конкретного этапа. Вы можете сделать это легко, переопределив __init__:

class FirstForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(FirstForm, self).__init__(*args, **kwargs)

        self.fields['some_required_field'].required = True
        # rinse and repeat

Сделайте то же самое в вашей второй итребуются третьи формы, опять-таки заполненные фактическими полями, которые требуются для этой конкретной формы.

Затем caПусть это будет день и выпить.

0 голосов
/ 24 января 2012

Если у вас есть дочерний экземпляр, он должен иметь член <base class name>_ptr, который указывает на экземпляр его суперкласса. Вы можете использовать это как основу запроса filter для извлечения дочернего элемента.

Вы также можете просто предположить, что экземпляры базового и производного классов будут иметь одинаковые id, если вы ничего не сделали, чтобы повлиять на распределение идентификаторов.

...