复制多对多值
Posted
技术标签:
【中文标题】复制多对多值【英文标题】:Copy ManyToMany Value 【发布时间】:2018-07-03 23:23:38 【问题描述】:我目前正在尝试将多对多字段从一个模型复制到另一个模型,但遇到了一些麻烦。我已经能够使用带有 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()
bulk_create 似乎存在某种错误?带有硬编码数字的个人添加工作得很好。当我尝试使用 (*self.readers.all()) 时,我没有收到错误消息,但 manytomany 引用没有复制到 over 表中。我看过几篇文章说我正在使用的命令工作得很好,但也许它用于 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())
【问题讨论】:
@kabanus 我正在尝试使用上面的代码进行复制。创建作者对象,然后尝试将读者添加到该对象。我读到你不能用 m2m 保存模型,你首先必须创建它,然后如果我理解正确,然后添加 m2m 属性。 我犯了一个新手错误。我在我的模型的 SAVE 功能中做这项工作。当我将命令移动到 post_save 函数时,命令按预期工作。 很高兴看到你想通了。如果您回想起来,这对社区来说不是一个有用的问题,我建议您删除它。否则,将您的发现作为答案发布,以便其他人受益。 【参考方案1】:作为一个新手,我通过在我的模型中覆盖 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())
【讨论】:
以上是关于复制多对多值的主要内容,如果未能解决你的问题,请参考以下文章