Создание модели Django из родительских данных - PullRequest
0 голосов
/ 04 марта 2010

Можно ли создать экземпляр подклассовой модели из ее родителя?

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 в предложениях if / else. Возможно ли это сделать? Когда я пытаюсь это сделать, я получаю ошибку внешнего ключа; Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено

Ответы [ 2 ]

1 голос
/ 04 марта 2010

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

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 голосов
/ 04 марта 2010

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

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

...