gpt4 book ai didi

django - 在Django中将数据从 “Many-To-Many”迁移到 “Many-To-Many Through”

转载 作者:行者123 更新时间:2023-12-03 13:41:12 25 4
gpt4 key购买 nike

我有模特儿

class Category(models.Model):
title = models.CharField(...)
entry = models.ManyToManyField(Entry,null=True,blank=True,
related_name='category_entries',
)

我希望重构每个关系的其他数据:
class Category(models.Model):
title = models.CharField(...)
entry = models.ManyToManyField(Entry,null=True,blank=True,
related_name='category_entries',
through='CategoryEntry',
)

但是南删除现有表。如何保留现有的m-t-m关系?

最佳答案

  • 现在,创建没有任何额外字段的中间模型。给它一个唯一的约束以匹配现有的约束,并指定表名以匹配现有的约束:
    class CategoryEntry(models.Model):
    category = models.ForeignKey(Category)
    entry = models.ForeignKey(Entry)

    class Meta:
    db_table='main_category_entries' #change main_ to your application
    unique_together = (('category', 'entry'))
  • 运行South模式迁移。
  • 编辑生成的模式迁移脚本,并注释掉所有向前和向后条目,因为您将重新使用现有的相交表。添加pass以完成方法。
  • 运行迁移。
  • 更新任何现有代码。正如https://docs.djangoproject.com/en/dev/topics/db/models/#many-to-many-relationships中所说,“与普通的多对多字段不同,您不能使用添加,创建或分配来创建关系”,因此您需要修改任何现有的应用程序代码,例如
    c.entry.add(e)

    可能成为:
    try:
    categoryentry = c.categoryentry_set.get(entry = e)
    except CategoryEntry.DoesNotExist:
    categoryentry = CategoryEntry(category=c, entry=e)
    categoryentry.save()

    和:
    e.category_entries.add(c)

    可能成为:
    categoryentry = CategoryEntry(category=c, entry=e)  #set extra fields here
    categoryentry.save()

    和:
    c.entry.remove(e)

    可能成为:
    categoryentry = c.categoryentry_set.get(entry = e)
    categoryentry.delete()
  • 完成此初始伪迁移后,您应该能够将其他字段添加到CategoryEntry中,并照常创建进一步的迁移。
  • 关于django - 在Django中将数据从 “Many-To-Many”迁移到 “Many-To-Many Through”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11466358/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com