2010-03-04 81 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领域中的if/else子句。是否有可能做到这一点?当我尝试这个时,我得到一个外键错误; 不能添加或更新子行:外键约束失败

回答

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

谢谢。我会先给它,看看它是否做我想要的。 – 2010-03-04 06:54:40

0

你在做什么几乎是正确的,但如果你想复制它,你将不得不删除主键。

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

+0

我没有看到Object2(object1_ptr = obj1,可以几乎是正确的。你想在哪里插入一个del obj2.id? – stefanw 2010-03-04 01:46:31

+0

我假设'obj1'已经存在于数据库中,尽管这可能是不正确的假设 在删除/保存之前,自然会出现这种情况,虽然看到你的回答,但似乎我可能会误解了这个问题 点仍然存在,如果对象已经存在于数据库中,删除主键让Django重新插入它 – Wolph 2010-03-04 02:33:23

+0

感谢您的回复我现在只是使用if/else语句来处理这个问题,并根据规则的结果创建每个对象,我只想避免重复创建对象的代码,我的例子很小,但真实的对象有更多的fie LDS。添加/编辑保存/删除是我以类似方式处理您的建议的另一个问题。再次感谢。 – 2010-03-04 06:53:51