2016-01-17 44 views
-1

我有一个模型,MyModel,与经理MyModelManager,其中有一个create_mymodel(....)方法:Django:使用自定义方法从ModelForm创建新对象,这可以吗?

def create_mymodel(self, foo, bar): 
    new_obj = MyModel(
     foo = foo, 
     bar = bar, 
     # the rest of the fields are calculated 
    ) 
    new_obj.save() 
    return new_obj 

在其他地方我有一个ModelForm创建新MyModel对象。

在处理表单提交的视图中,我不想重复所有create_mymodel(foo, bar)方法已经完成的计算,那么我可以这样做吗?

form = MyModelForm(request.POST or None) 

if form.is_valid(): 
    new_obj = form.save(commit=False) 
    MyModel.objects.create_myModel(new_obj.foo, new_obj.bar) 

从文档,我担心什么the docs say有关使用f.save(commit=False),因为我不知道它是如何影响我的情况,特别是f.save_m2m()事情。

+0

计算字段的值,然后从父母中调用'create()'所有你想传入的值。 – yedpodtrzitko

+0

也许我的问题不清楚。我已经在create()中进行了计算,我不想复制该代码。我关心的是使用'form.save(commit = False)' – 43Tesseracts

回答

0

我将这里的反应而不是评论,所以我可以添加一些代码示例。我可以考虑两种可能的选择,但我不确定它们的可行性(因为我不知道其他代码库)。

第一个 - 你可以使用form.save(commit=False)如提及,但使用管理器中的特殊功能的isntead,你会做这样的事情:

if form.is_valid(): 
    new_obj = form.save(commit=False) 
    new_obj.calculate_the_other_fields() 
    new_obj.save() 

^其中calculate_the_other_fields()是一种方法,该方法计算并设定你提到的“其他值”(它也将帮助你将你的代码分成更小的块来遵循单一责任原则)。然后,您只需拨打save(),它将以与create_mymodel相同的方式为您创建数据库记录。

其他选项:

只是覆盖create()的经理。检查是否有足够的数据计算值并计算它们(否则跳过计算),然后从父项调用create()。然后你可以使用这个:

if form.is_valid(): 
    new_obj = form.save() 
相关问题