2012-01-24 2 views
0

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

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

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 

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

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

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

Спасибо!

ответ

1

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

UPDATE

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

Так, например. Установите модель самостоятельно, как будто ничего (или только элементы в первой форме) не требуются. Затем, в вашей первой форме, создайте поля, необходимые для этого конкретного этапа. Вы можете сделать это легко перекрывая __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 

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

Затем назовите его днем ​​и выпейте.

+0

Спасибо, но не могу использовать их, потому что формы подаются в разные дни разными людьми. –

0

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

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

+0

спасибо! У меня есть базовый экземпляр, а не дочерний, и я предполагаю это, но запрос pc = ProyectoCalificado.objects.get (pk = id) (являющийся id id базового класса) ничего не получает –