【问题标题】:Django Model; saving extra items in a ManyToMany field on saveDjango模型;保存时在多对多字段中保存额外项目
【发布时间】:2013-12-08 12:48:59
【问题描述】:

所以我目前正在为现有的数据库实施一个新的标记系统。

当前的标记系统使用 ManyToMany 字段,但是客户端希望有一个逗号分隔的输入字段 (CharField)。

所以我想出了最好的方法,在不危及当前架构的情况下,启用新的逗号分隔字段,但将标签写为以前的 ManyToMany 架构。

但是无论我怎么尝试,标签都会保存到数据库标签模型中,而不是保存在它们应该应用的条目上。

简单介绍:

 def save(self, *args, **kwargs):

    currTags = self.placeHolderTags.split(",") 

    for tag in currTags:
        dbtag, created = Tag.objects.get_or_create(name=tag)
        self.tags.add(dbtag)

    super(BeeldBankEntry, self).save(*args, **kwargs)

进一步的模型背景:

tags            =   models.ManyToManyField(Tag, verbose_name='Tags', blank=True)
placeHolderTags =   models.CharField(max_length=400, verbose_name='Tags2', blank=True)

【问题讨论】:

  • get_or_create() 返回一个查询集,你试过 get_or_create()[0] 吗?
  • get_or_create 返回一个 (object, created_flag) 的元组

标签: django manytomanyfield


【解决方案1】:

这是由于 django 在模型本身之后保存了 m2m 字段。我不确定在 save() 中的代码之前保存是否会有所帮助,请查看 m2m_changed 信号 - 它看起来正是您所需要的。

【讨论】:

  • 这会导致无限循环,但我确实一直在 super.save() 之后添加标签,但这并没有真正起作用。我会研究一下信号,看起来很有希望。
猜你喜欢
  • 1970-01-01
  • 2014-08-27
  • 2014-02-26
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 2018-09-30
相关资源
最近更新 更多