如何在Django中处理未保存的多对多关系?
问题内容:
我在django中有几个模型,它们是多对多连接的。我想 在内存中
创建这些模型的实例,将它们呈现给用户(通过视图模板内部的自定义方法调用),如果用户满意,请将其保存到数据库中。
但是,如果我尝试对模型实例执行任何操作(例如,调用渲染方法),则会收到一条错误消息,提示我必须先保存实例。文档说这是因为模型之间存在多对多关系。
如何向用户展示对象,并允许他/她保存或丢弃它们而不会使数据库混乱?
(我想我可以关闭事务处理,并在整个项目中自己完成,但这听起来像是一种容易出错的措施……)
谢谢!
问题答案:
我认为使用django表单可能是答案,如本文档中概述(搜索m2m
…)。
编辑后为可能遇到相同问题的其他人添加了一些解释:
说您有一个这样的模型:
from django.db import models
from django.forms import ModelForm
class Foo(models.Model):
name = models.CharField(max_length = 30)
class Bar(models.Model):
foos = models.ManyToManyField(Foo)
def __unicode__(self):
return " ".join([x.name for x in foos])
那么您将无法在未保存的Bar对象上调用unicode()。如果您确实想在保存之前打印出所有内容,则必须执行以下操作:
class BarForm(ModelForm):
class Meta:
model = Bar
def example():
f1 = Foo(name = 'sue')
f1.save()
f2 = foo(name = 'wendy')
f2.save()
bf = BarForm({'foos' : [f1.id, f2.id]})
b = bf.save(commit = false)
# unfortunately, unicode(b) doesn't work before it is saved properly,
# so we need to do it this way:
if(not bf.is_valid()):
print bf.errors
else:
for (key, value) in bf.cleaned_data.items():
print key + " => " + str(value)
因此,在这种情况下,您必须保存Foo对象(在保存之前,可以使用它们自己的形式进行验证),并且在保存具有很多对很多键的模型之前,您也可以对其进行验证。所有这些都无需太早保存数据并弄乱数据库或处理事务…