我在表单上遇到了这个问题,保存数据需要在某个地方保留,然后经过付款流程,然后成功检索数据并保存到正确的模型。
我已经看到这是使用会话完成的,但是在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。
以下是问题:
以前有人这样做过吗?
如何将子模型类的实例正确移动到父模型类?
编辑:
还有其他不同的方法可以做到这一点,例如在表格中添加额外的字段,是的,如果我在没有ORM框架的情况下使用PHP,我会做到这一点,但由于ORM在django中相当不错,我以为我可能会尝试不同的东西。
因为我在这里问,这意味着我也不相信这种方法。你有什么想法?
答案 0 :(得分:0)
正如问题评论中所建议的那样,在包含付款状态的模型中添加额外字段可能是最简单的方法。从概念上讲,它是同一个对象,它只是在付款完成后状态发生变化。正如您所指出的,您将需要逻辑来清除数据库中的项目,这些项目永远不会通过付款等必需的状态。这可能需要在模型中添加payment_state
和state_change_time
字段,以指示上次更改状态的时间。如果状态为PAYMENT_PENDING
的时间太长,则可以清除该记录。
如果你采取的措施是将未付款的商品存储在您建议的其他表格中,您仍然需要管理该表格,以确定何时删除商品是安全的。例如,如果从未处理过付款,您何时会从A_temp
表中删除记录?此外,拥有一个单独的表意味着您实际上只有两个可能的状态,付费和未付款,由记录发生的表确定。拥有payment_state
的单个表可能更灵活,因为它允许您根据需要扩展状态。例如。我们假设您确定需要付款状态ITEM_SUBMITTED
,AWAITING_PAYMENT
,PAYMENT_ACCEPTED
,PAYMENT_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
实例。