Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何处理django中未保存的多对多关系?_Python_Django_Django Models_Many To Many - Fatal编程技术网

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

Python 如何处理django中未保存的多对多关系?,python,django,django-models,many-to-many,Python,Django,Django Models,Many To Many,我在django有几个模型,它们是多对多连接的。我想在内存中创建这些模型的实例,将它们呈现给用户(通过视图模板中的自定义方法调用),如果用户满意,将它们保存到数据库中 但是,如果我尝试对模型实例执行任何操作(例如,调用渲染方法),我会收到一条错误消息,表明我必须先保存实例。文档中说,这是因为模型处于多对多关系中 我如何向用户呈现对象,并允许他/她保存或丢弃它们,而不会扰乱我的数据库 (我想我可以关闭事务处理,并在整个项目中自己完成,但这听起来像是一个潜在的容易出错的措施…) 谢谢 我会添加一个字

我在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对象(在保存它们之前,您可以使用它们自己的形式验证这些对象),并且在保存具有多对多键的模型之前,您还可以验证这些对象。所有这些都不需要过早地保存数据、打乱数据库或处理事务……

很晚才回答,但wagtail的团队已经开发了一个单独的Django扩展名为。这是他们的CMS初稿预览的动力

它允许您这样做(从他们的自述):

然后,可以这样使用模型:

beatles = Band(name='The Beatles')
beatles.members = [
    BandMember(name='John Lennon'),
    BandMember(name='Paul McCartney'),
]
这里,
ParentalKey
取代了Django的
ForeignKey
。类似地,他们有
ParentalManyToManyField
来取代Django的
ManyToManyField

beatles = Band(name='The Beatles')
beatles.members = [
    BandMember(name='John Lennon'),
    BandMember(name='Paul McCartney'),
]