我正在处理一个ModelForm,这两个似乎都返回相同的结果:
if request.method == 'POST':
form = FooForm(request.POST)
if form.is_valid():
bar = form.save(commit = False)
bar.user = request.user
form.save()
if request.method == 'POST':
form = FooForm(request.POST)
if form.is_valid():
bar = form.save(commit = False)
bar.user = request.user
bar.save() # calling save on bar instead of on the form
就如何保存数据和数据之间的关系而言,这两者有何不同?当我需要使用bar.save_m2m()时,第二种方法似乎不起作用,这让我觉得第一种方法是正确的方法。但是,第二种方法的逻辑对我来说更有意义。任何人都可以为我澄清哪一个更正确,为什么?我担心我无意中错误地处理数据并设置我的应用程序以解决问题。
答案 0 :(得分:1)
从Django的网站上,这可能会清除你应该做的事情:
# Create a form instance with POST data.
>>> f = AuthorForm(request.POST)
# Create, but don't save the new author instance.
>>> new_author = f.save(commit=False)
# Modify the author in some way.
>>> new_author.some_field = 'some_value'
# Save the new instance.
>>> new_author.save()
# Now, save the many-to-many data for the form.
>>> f.save_m2m()
来自https://docs.djangoproject.com/en/1.6/topics/forms/modelforms/
这是从Django 1.6.2的源代码中提取的:
if commit:
# If we are committing, save the instance and the m2m data immediately.
instance.save()
save_m2m()
else:
# We're not committing. Add a method to the form to allow deferred
# saving of m2m data.
form.save_m2m = save_m2m
return instance
这就是为什么如果在Ex1:form.save()之后调用bar.save_m2m(),一切都会好的,你将逐步执行一个普通的save()。 Base类每次都返回它的实例,所以如果你调用save()它会保存你从外面指向的同一个实例,并且你刚修改过(警告:你是否将它用作全局变量?)...和无论如何你不能确定这个方法能按你的预期工作多长时间,因为在文档中没有任何地方说调用form.save(commit = False)时返回的实例与调用form.save()时使用的实例相同下方。
据我所知,您想知道哪种方式可以避免将来出现问题...我的建议是:选择第二种方式!