复制ManyToMany值

时间:2018-01-24 19:50:17

标签: python-3.x postgresql django-models django-forms django-templates

我目前正在尝试将多对多字段从一个模型复制到另一个模型,但遇到了一些麻烦。我已经能够使用ModelMultipleChoiceField创建具有多对多字段的模型,并且模型保存了我想要的方式。当我尝试将其复制到另一个模型时,我没有收到错误,但没有任何反应。这是我尝试过的代码:

author =  Author.objects.create(author=self.author) 

author = Author.objects.all()[0]
book = entry.approvers.all()
author.pk = None
author.readers.add(*self.readers.all())

我研究了这一切,看到M2M模型可能很棘手。我已经尝试了上面代码的几种变体,但没有任何效果。我通过几个必须是实例错误的工作,这就是我发现author = Author.objects.all()[0]命令的方式。我不再收到错误,但我的多对多值也没有被复制到另一个模型。谢谢你的帮助。

我在SO上找到了这个参考,它似乎对我有所帮助,但我尝试了它并且它不起作用。我正在使用基于通用类的视图,这可能是让我有点额外悲伤的原因。

Class Based Views (CBV), CreateView and request.user with a many-to-many relation

从示例中,我将此模板用于我的代码,但无济于事。

在可以使用多对多关系之前,我需要为字段“id”设置一个值。

我刚发现此引用Django. Create object ManyToManyField error

它有效,然后我可以使用以下命令发布一个M2M值,但是如何在不对pk进行硬编码的情况下执行此操作?

book.reader.add('1')

以上是有效的,但是当我尝试类似

的时候
book.reader.add(*self.readers.all())

我进一步研究了这个...

author =  Author.objects.create(author=self.author) 

另外,仅此一项工作......

book.reader.add('1')

只需要弄清楚如何用变量名替换'1'。

经过更多调查后,这可能与以下问题有关?

Django: IntegrityError during Many To Many add()

看起来miss_create可能存在某种错误?添加硬编码的个人工作正常。当我尝试使用(* self.readers.all())时,我没有收到错误消息,但manytomany引用没有被复制到over table。我看过几篇文章说我正在使用的命令工作得很好,但也许是PostgreSQL之外的其他东西。

感谢您的任何想法。

作为一个新手,我在SAVE做这项工作。一旦我将其移动到post_save,以下格式按预期工作...

@receiver(post_save, sender='Test.Book')
  def post_save(sender,instance, **kwargs):

author = book.objects.create(subject=instance.book)
author.approvers.add(*instance.approvers.all())

1 个答案:

答案 0 :(得分:0)

作为一个新手,我通过在我的模型中覆盖SAVE而不是在post_save信号中执行此工作来完成此工作。改变我的方法解决了我的问题。与我的正确方法相关的代码是..

@receiver(post_save,sender='Test.Book')
def post_save(sender,instance,**kwargs):
    author = book.objects.create(subject=instance.book)
    author.approvers.add(*instance.approvers.all())