从父数据实例化django模型

时间:2010-03-04 01:02:00

标签: django models

是否可以从其父级实例化子类型模型?

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')

我不想重复if / else子句中的Object1字段。有可能做到这一点吗?当我尝试这个时,我得到一个外键错误;    无法添加或更新子行:外键约束失败

2 个答案:

答案 0 :(得分:1)

我建议做这样的事情:

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已更改。

答案 1 :(得分:0)

您所做的几乎是正确的,但如果您想复制它,则必须删除主键。

所以...这应该解决它:del obj2.id 但请注意,如果某个其他模型使用引用obj1的外键引用您的模型,而不是obj2。当然,obj1仍然存在。