如何在django中处理未保存的多对多关系?

qol*_*lin 5 python django many-to-many django-models

我在django中有几个连接多对多的模型.我想在内存中创建这些模型的实例,将它们呈现给用户(通过view-templates中的自定义方法调用),如果用户满意,则将它们保存到数据库中.

但是,如果我尝试对模型实例(例如,调用呈现方法)执行任何操作,则会收到一条错误消息,指出我必须先保存实例.文档说这是因为模型处于多对多的关系中.

如何向用户显示对象并允许他/她保存或丢弃它们而不会使我的数据库混乱?

(我想我可以关闭交易处理并在整个项目中自己完成,但这听起来像是一个容易出错的措施...)

谢谢!

Aar*_*paa 6

我会添加一个字段,指示对象是"草稿"还是"实时".这样他们就会在请求,会话等方面持续存在,并且django停止抱怨.

然后,您可以过滤对象以仅在公共视图中显示"实时"对象,并仅向创建它们的用户显示"草稿"对象.这也可以扩展为允许"存档"对象(或任何其他有意义的状态).


lil*_*ith 5

我认为使用 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])
Run Code Online (Sandbox Code Playgroud)

那么你就不能在未保存的 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)
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,您必须保存 Foo 对象(您可以在保存这些对象之前使用它们自己的形式对其进行验证),并且在保存具有多对多键的模型之前,您也可以验证它们。所有这些都不需要过早保存数据并弄乱数据库或处理事务......