django在父模型和子模型类之间保存实例

时间:2013-05-26 22:41:44

标签: django inheritance model

我在表单上遇到了这个问题,保存数据需要在某个地方保留,然后经过付款流程,然后成功检索数据并保存到正确的模型。

我已经看到这是使用会话完成的,但是在commit=False时保持文件上传的一些hacky方式并且它看起来不是非常pythonic

我在想如果我有一个模型类A,并且有一个扩展A的子类,例如A_Temp

class A(models.Model):
  name = models.CharField(max_lenght=25)
  image = models.ImageField()

class A_Temp(A):
  pass

class AForm(forms.ModelForm):
  class Meta:
    model = A_Temp

在模型表单(A_Temp)上,它存储到A_Temp,当付款成功时,它将实例移动到父模型类A。

以下是问题:

  1. 以前有人这样做过吗?

  2. 如何将子模型类的实例正确移动到父模型类?

  3. 编辑:

    还有其他不同的方法可以做到这一点,例如在表格中添加额外的字段,是的,如果我在没有ORM框架的情况下使用PHP,我会做到这一点,但由于ORM在django中相当不错,我以为我可能会尝试不同的东西。

    因为我在这里问,这意味着我也不相信这种方法。你有什么想法?

1 个答案:

答案 0 :(得分:0)

正如问题评论中所建议的那样,在包含付款状态的模型中添加额外字段可能是最简单的方法。从概念上讲,它是同一个对象,它只是在付款完成后状态发生变化。正如您所指出的,您将需要逻辑来清除数据库中的项目,这些项目永远不会通过付款等必需的状态。这可能需要在模型中添加payment_statestate_change_time字段,以指示上次更改状态的时间。如果状态为PAYMENT_PENDING的时间太长,则可以清除该记录。

如果你采取的措施是将未付款的商品存储在您建议的其他表格中,您仍然需要管理该表格,以确定何时删除商品是安全的。例如,如果从未处理过付款,您何时会从A_temp表中删除记录?此外,拥有一个单独的表意味着您实际上只有两个可能的状态,付费和未付款,由记录发生的表确定。拥有payment_state的单个表可能更灵活,因为它允许您根据需要扩展状态。例如。我们假设您确定需要付款状态ITEM_SUBMITTEDAWAITING_PAYMENTPAYMENT_ACCEPTEDPAYMENT_REJECTED。这可以通过单个state字段实现。如果按照您的描述实施,则您需要为每个州提供单独的表格。

说了这么多,如果您仍然设置了单独的表结构,则可以创建一个函数,将值从A_temp的实例复制到A。以下内容可能有效,但任何关系类型字段(如ForeignKey)都可能需要特别注意。

def copy_A_temp_to_A(a, a_temp):
    for field_name in a._meta.fields:
        value = getattr(a, field_name)
        setattr(a_temp, field_name, value)

当您需要从A_temp移动到A时,您必须实例化A实例,然后调用复制功能save实例并从数据库中删除A_temp实例。