Django dumpdata 和 loaddata 不适用于多对多中间模型

Posted

技术标签:

【中文标题】Django dumpdata 和 loaddata 不适用于多对多中间模型【英文标题】:Django dumpdata and loaddata not working for many-to-many intermediary model 【发布时间】:2011-06-09 13:51:17 【问题描述】:

我在以下模型上使用带有 Django 1.2.3 的转储数据:

class Bar(models.Model):
    ...

class Foo(models.Model):
    bars = models.ManyToManyField(Bar, through="Foo_bar", blank=True, null=True)
    ...

class Foo_bar(models.Model):
    foo = models.ForeignKey(Foo)
    bar = models.ForeignKey(Bar)
    status = models.IntegerField()
    ...

json 夹具序列化了 Foo 对象中与 Foos 关联的条,当我尝试使用夹具运行 loaddata 时导致 AttributeError:

AttributeError: Cannot set values on a ManyToManyField which specifies an intermediary model.  Use App.Foo_bar's Manager instead.

根据我的read,dumpdata 可能已修复为不序列化 m2m,或者已修复 loaddata 以正确处理它们,但似乎并非如此。我已经尝试了 --natural 标志,仍然没有运气。有什么想法吗?

提前致谢。

【问题讨论】:

我看到了同样的行为。为什么它不适用于 m2m 字段?这对我来说似乎相当基本。你知道除了 dumpdata 之外还有什么其他方法可以让我的数据包含 json 格式的 m2m 字段吗? 【参考方案1】:

根据您需要对夹具执行的操作,django_extension 包中的命令“dumpscript”对于处理具有复杂关系的夹具非常有用。 文件中没有使用主键,它只是一个仅使用对象的 python 脚本,因此只需使用 object.save() 调用即可重新创建整个数据库。

【讨论】:

这并不能回答转储数据/加载数据的问题。中间 m2m 模型有那么复杂吗? 看起来 dumpscript 也不支持带有中间模型的 m2m(问题 48) 我用了这种fkey(通过=...),google代码网站没有更新,在github上关注他们... 正如您在我原始问题的代码 sn-p 中看到的那样,我也在使用“through=...”。你是说github上的代码修复了Issue 48?

以上是关于Django dumpdata 和 loaddata 不适用于多对多中间模型的主要内容,如果未能解决你的问题,请参考以下文章

python测试开发django-176.数据库迁移数据(manage.py dumpdata)

python测试开发django-176.数据库迁移数据(manage.py dumpdata)

Django dumpdata 生成无效的 json 格式文件

带有转储数据和迁移的 Django 备份策略

Django 的 JSON 和 XML 夹具导致 UnicodeEncodeError

单个模型的 Django 转储数据?