Я думаю, что использование форм 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])
тогда вы не можете вызвать unicode () для несохраненного объекта Bar. Если вы хотите распечатать вещи до того, как они будут сохранены, вы должны сделать это:
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 (которые вы можете проверить перед сохранением их, используя их собственную форму), и перед сохранением моделей со многими или многими ключами вы также можете проверить их. Все без необходимости сохранять данные слишком рано и портить базу данных или иметь дело с транзакциями ...