将字段更改为ManyToMany时Django数据迁移

2024-02-26

我有一个 Django 应用程序,我想将字段从foreignkey更改为ManyToManyField。我想保留我的旧数据。为此,最简单/最好的流程是什么?如果重要的话,我使用 sqlite3 作为我的数据库后端。

如果我对问题的总结不清楚,这里有一个例子。假设我有两个模型:

class Author(models.Model):  
    author = models.CharField(max_length=100) 

class Book(models.Model):  
    author = models.ForeignKey(Author)  
    title = models.CharField(max_length=100)

假设我的数据库中有很多数据。现在,我想将 Book 模型更改如下:

class Book(models.Model):  
    author = models.ManyToManyField(Author)  
    title = models.CharField(max_length=100) 

我不想“丢失”所有以前的数据。

完成此任务的最佳/最简单方法是什么?

Ken


我意识到这个问题很老了,当时数据迁移的最佳选择是使用南方。现在 Django 有了自己的migrate命令,过程略有不同。

我已将这些模型添加到名为的应用程序中books-- 如果这不是您的情况,请进行相应调整。

首先,将字段添加到Book and a related_name至少一个或两个(否则它们会发生冲突):

class Book(models.Model):  
    author = models.ForeignKey(Author, related_name='book')
    authors = models.ManyToManyField(Author, related_name='books')
    title = models.CharField(max_length=100) 

生成迁移:

$ ./manage.py makemigrations
Migrations for 'books':
  0002_auto_20151222_1457.py:
    - Add field authors to book
    - Alter field author on book

现在,创建一个空迁移来保存数据本身的迁移:

./manage.py makemigrations books --empty
    Migrations for 'books':
0003_auto_20151222_1459.py:

并向其中添加以下内容。要准确了解其工作原理,请查看以下文档数据迁移 https://docs.djangoproject.com/en/dev/topics/migrations/#data-migrations。注意不要覆盖迁移依赖项。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


def make_many_authors(apps, schema_editor):
    """
        Adds the Author object in Book.author to the
        many-to-many relationship in Book.authors
    """
    Book = apps.get_model('books', 'Book')

    for book in Book.objects.all():
        book.authors.add(book.author)


class Migration(migrations.Migration):

    dependencies = [
        ('books', '0002_auto_20151222_1457'),
    ]

    operations = [
        migrations.RunPython(make_many_authors),
    ]

现在删除author模型中的字段——它应该看起来像这样:

class Book(models.Model):
    authors = models.ManyToManyField(Author, related_name='books')
    title = models.CharField(max_length=100)

为此创建一个新的迁移,然后运行它们:

$ ./manage.py makemigrations
Migrations for 'books':
  0004_remove_book_author.py:
    - Remove field author from book

$ ./manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: messages, staticfiles
  Apply all migrations: admin, auth, sessions, books, contenttypes
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying books.0002_auto_20151222_1457... OK
  Applying books.0003_auto_20151222_1459... OK
  Applying books.0004_remove_book_author... OK

就是这样。作者先前可在book.author现在应该在您获得的查询集中book.authors.all().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字段更改为ManyToMany时Django数据迁移 的相关文章

随机推荐

  • 在 JavaScript 中,可迭代对象应该是可重复迭代的吗?

    我发现有些iterable可以重复迭代 const iterable Symbol iterator function yield 1 yield 3 yield 5 console log iterable console log ite
  • 我可以在 mongodb 的 NodeJS 驱动程序中手动指定 BSON 类型吗?如果我使用“$numberLong”,则会出现错误

    这就是我在将文档对象插入集合之前构建文档对象的方式 function newTupple name email return email email name name account status email verified I wan
  • 如何扭曲图像[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在做一个项目 我们需要扭曲图像 基本上 我想拍摄这张图片 并将其变成这样 请注意 文字也变形了 老实说 我不知道如何去做 所以任何帮助
  • 我什么时候应该使用 sed,什么时候应该使用 awk [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 解密 Android 设备上加密的字符串

    在 Android 4 4 设备上 已使用 spring android auth 1 0 1 RELEASE 模块中的 org springframework security crypto encrypt AndroidEncrypto
  • 在 LINQ to SQL 下管理不同开发人员的连接字符串

    使用 Subversion 中的源代码 当两台不同的计算机具有不同的连接字符串时 我会遇到问题 LINQ to SQL 设计器似乎只喜欢具有相同的连接字符串 设计者是否可以使用因开发人员具有不同的本地配置而变化的连接字符串 但 Web 应用
  • 如何开始使用 ReactJS Hello World 示例?

    我正在使用 MacBook Pro 我更喜欢在虚拟机中使用 ubuntu 进行 Web 开发 我在 Macbook 中创建了一个 index html 然后只需使用 Chrome 打开它 html 是按照此创建的video https eg
  • 在 python 中解析字符串:如何分割换行符,同时忽略引号内的换行符

    我有一个需要用 python 解析的文本 这是一个字符串 我想将其拆分为行列表 但是 如果换行符 n 在引号内 那么我们应该忽略它 例如 abcd efgh ijk n1234 567 qqqq n 890 n 应解析为以下几行的列表 ab
  • 无法在动态链接库 libstdc++-6.dll 中定位过程入口点 _gxx_personality_v0 错误

    昨天 我决定下载 安装并尝试使用 Allegro 5 我还下载了带有 MinGW 编译器的 Code Blocks 12 11 我设置了所有内容并正确安装了所有内容 或者我是这么认为的 并尝试运行示例代码以查看它是否有效 include
  • NSIS 插件“nsScreenshot”在 Windows NT 6.x 中不起作用

    我添加了一个比原始插件晚3年发布的代码 但它仍然返回错误 代码很简单 恕我直言 但我仍然很可能错过某些方面 看这段代码 nsScreenshot NSIS Plugin c 2003 Leon Zandman email protected
  • C#中主线程的引用

    如何从 C 中的另一个线程获取对主线程的引用 为什么需要这个 以加载到控制台应用程序的程序集为例 该程序集引发另一个想要在控制台应用程序的主线程上等待 加入 的线程 它将如何做到这一点 我是这样想的 在 Visual Studio 2010
  • 如何在asp.net core中定义返回html的函数

    基本上我需要像旧的 asp net 这样的东西 helper MakeNote string content p strong Note strong nbsp nbsp content p or JSX MakeNote note ret
  • 将流量从 80 转发到 8080 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经用puppet安装了tomcat 它在标准 8080 端口上运行 tomcat进程以tomcat用户身份启动 我想将所有流量从端口
  • iOS:使用HKObserverQuery的后台更新completionHandler

    HKObserverQuery有以下方法支持在后台接收更新 initWithSampleType predicate updateHandler The updateHandler has a completionHandler其中有以下内
  • 从 git 存储库中提取作者信息

    我正在尝试从 git 存储库中提取 源代码行 作者标签 对 最简单的方法是使用 git Blame 问题是 gitblame 将最后一个提交者视为作者 无论提交者只是缩进代码还是真正更改了代码 你知道有什么更好的方法吗 或者也许在尝试解决问
  • 将 WPF 用户控件选择传递给主机控件

    我有一个带有列表框的 WPF 用户控件 我想通过绑定将列表框中的选定项传递给调用控件 我怎样才能实现这个目标 您可以在用户控件上公开 SelectedItem 的新属性 并将其绑定到子控件 ListBox 用户控件的代码 不过我是从 Con
  • 自定义函数类

    我正在开发一个涉及从其他函数构造函数的项目 我有编写一个类来简化事情的想法 但如果不求助于使用我就无法让它工作 proto 这基本上就是我的愿景 function MyFunction var myFn new MyFunction myF
  • Express.js + lint 给出错误

    https www youtube com watch v Fa4cRMaTDUI https www youtube com watch v Fa4cRMaTDUI我正在观看这节课 并试图重现作者所做的一切 19 00 他设置了 vue
  • 特定模型的 Django 管理自定义模板

    我正在尝试在 Django 管理中为特定模型添加自定义模板 基本上我想在 Django admin 中显示地址模型的 Google 地图 那么对此有什么帮助吗 FineManual tm 对此进行了全面介绍 因此请先阅读此内容 检查这个网址
  • 将字段更改为ManyToMany时Django数据迁移

    我有一个 Django 应用程序 我想将字段从foreignkey更改为ManyToManyField 我想保留我的旧数据 为此 最简单 最好的流程是什么 如果重要的话 我使用 sqlite3 作为我的数据库后端 如果我对问题的总结不清楚