复制多对多值

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())

【讨论】:

以上是关于复制多对多值的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate之多对多篇

我们如何在 Keras 中定义一对一、一对多、多对一和多对多的 LSTM 神经网络? [复制]

多对多关系 GAE NDB 需要父母还是子女?

在 Django Admin 中过滤多对多框

hibernate多对多查询

使用 linq/Entity Framework 查询多对多关系。代码优先