このドキュメントで概説されているように、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オブジェクトを保存しておく必要があり(オブジェクトを保存する前に、独自のフォームを使用して検証できます)、モデルを多対多のキーで保存する前に、それらも検証できます。データを保存するのが早すぎて、データベースを台無しにしたり、トランザクションを処理したりする必要はありません...