【问题标题】:Instantiate django model from parent data从父数据实例化 django 模型
【发布时间】:2010-03-04 01:01:59
【问题描述】:

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

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 字段。有可能做到这一点吗?当我尝试这个时,我得到一个外键错误; 无法添加或更新子行:外键约束失败

【问题讨论】:

    标签: django models


    【解决方案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 会发生变化。

    【讨论】:

    • 谢谢。我会先给它,看看它是否符合我的要求。
    【解决方案2】:

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

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

    【讨论】:

    • 我看不出 Object2(object1_ptr=obj1, 几乎是正确的。你想在哪里插入 del obj2.id?
    • 我假设obj1 已经存在于数据库中,尽管这可能是一个不正确的假设。 del woud 自然是在插入/保存之前。虽然,看到你的回答,似乎我可能误解了这个问题。重点仍然存在,如果该对象已经存在于数据库中,您将需要删除主键以便 Django 重新插入它。
    • 感谢您的回复。我目前只是使用 if/else 语句来处理这个问题并根据规则的结果创建每个对象,我想要避免的只是复制用于创建对象的代码,我的示例很小,但真实的对象有更大字段数。添加/编辑保存/删除是我正在以与您的建议类似的方式处理的另一件事。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-11-15
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多