问题描述
我有一个模型
class Category(models.Model):
title = models.CharField(...)
entry = models.ManyToManyField(Entry,null=True,blank=True,
related_name='category_entries',
)
我想重构每个关系的附加数据:
That I wish to refactor to have additional data with each relationship:
class Category(models.Model):
title = models.CharField(...)
entry = models.ManyToManyField(Entry,null=True,blank=True,
related_name='category_entries',
through='CategoryEntry',
)
But south deletes the existing table. How can I preserve the existing m-t-m relationships?
推荐答案
-
额外的领域,现在。给它一个唯一的约束,以匹配现有的约束,并指定表名称以匹配现有的名称:
Create your intermediate model without any extra fields, for now. Give it a unique constraint to match the existing one and specify the table name to match the existing one:
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'))
运行南方模式迁移
Run the South schema migration.
编辑生成的模式迁移脚本,并注释掉所有的向前和向后的条目,使用现有的交叉表。添加 pass
来完成这些方法。
Edit the generated schema migration script and comment-out all the forwards and backwards entries, since you'll be re-using the existing intersection table. Add pass
to complete the methods.
运行迁移。
更新任何现有的代码。如,与正常的多对多字段不同,您不能使用添加,创建或分配来创建关系,所以你需要修改任何现有的应用程序代码,例如
Update any existing code. As it says in https://docs.djangoproject.com/en/dev/topics/db/models/#many-to-many-relationships, "Unlike normal many-to-many fields, you can't use add, create, or assignment to create relationships" so you'll need to modify any existing application code, e.g.
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
并正常创建进一步的迁移。
Once this initial pseudo migration has been done, you should then be able to add the extra fields to the CategoryEntry
and create further migrations as normal.
这篇关于从“多对多”迁移数据到“多对多通过”在django的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!