2010-03-04 2 views
0

Возможно ли создать экземпляр модели подкласса из родительского элемента?Создание модели django из исходных данных

class Object1(models.Model): 
    field1a = models.CharField() 
    field1b = models.CharField() 
    feild1c = models.ForeignKey(Object4)  

class Object2(Object1): 
    field3 = models.CharField() 

class Object3(Object1): 
    field3 = models.CharField() 

class Object4(models.Model): 
    field4 = models.CharField() 

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

Что-то вроде:

obj4 = Object4(field4='d') 
obj1 = Object1(field1a='a', field1b='b', field1c=obj4) 
if somerule: 
    obj2 = Object2(object1_ptr=obj1, field2='2') 
else: 
    obj3 = Object3(object1_ptr=obj1, field3='3') 

Я не хочу повторять поля Object1 в если/других статьях. Можно ли это сделать? Когда я пытаюсь это сделать, я получаю ошибку внешнего ключа; Невозможно добавить или обновить дочернюю строку: Ограничение внешнего ключа не удается

ответ

0

Я рекомендую делать что-то вроде этого:

attr = dict(field1a='a', field1b='b', field1c=obj4) 
obj1 = Object1(**attr) 
if somerule: 
    attr["field2"] = 2 
    obj2 = Object2(**attr) 
else: 
    attr["field3"]='3' 
    obj3 = Object3(**attr) 

Имейте в виду, что словарь attr изменения на месте.

+0

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

0

Что вы делаете, это почти правильно, но если вы хотите его скопировать, вам придется удалить первичный ключ.

Итак ... это должно исправить: del obj2.id Обратите внимание, что если какая-либо другая модель ссылается на вашу модель с внешним ключом, то она ссылается на obj1, а не obj2. И obj1, разумеется, все еще существует.

+0

Я не вижу, как Object2 (object1_ptr = obj1, может быть почти правильным.И где вы хотите вставить del obj2.id? – stefanw

+0

Я предполагаю, что 'obj1' уже существует в базе данных, хотя это может быть неверно Точка остается, однако, если объект уже существует в базе данных, вам понадобится для удаления первичного ключа для повторного ввода Django. – Wolph

+0

Спасибо за ответы. Я просто использую инструкции if/else для обработки этого и создания каждого объекта в зависимости от результата правила, все, чего я хотел избежать, было дублирование код для создания объектов, мой пример мал, но реальные объекты имеют большее количество fie LDS. Добавление/редактирование сохранения/удаления - это еще один вопрос, который я обрабатываю в соответствии с вашими предложениями. Еще раз спасибо. –

Смежные вопросы