我想要实现的目标
到目前为止,我们已经有了像下面这样具有多对多关系的模型。
class A(models.Model):
name = models.CharField(max_length=255)
data = models.ManyToManyField(B, related_name='data', through='C')
class B(models.Model):
name=models.CharField(max_length=255)
class C(models.Model):
a = ForeignKey(A)
b = ForeignKey(B)
c = model.CharField(max_length=255)
active = models.BooleanField(default=True)
and so on....
尽管Django会自动为许多对多关系创建一个中间表,但如果我们没有明确定义它,就像您已经注意到的那样,我已经明确定义了第三个中间表来存储有关每个关系的额外元数据。
因此,根据新的业务要求,我们需要将表中的许多对多关系移除,并替换为一对多关系,即B的每个记录可以有多个对A obj的引用,但A的记录始终只有一个对A obj的引用。
另外,由于这些表已经在生产中使用,因此我们还需要迁移现有数据。
到目前为止,我尝试了以下方法:
从模型A中删除了许多对多关系。
class A(models.Model):
name = models.CharField(max_length=255)
data = models.ForeignKey(B)
更新了模型 C 的现有行。
例如:
#this might return more than one obj because of many to many relationship
test = C.objects.filter(a__id=<a obj id>)
for t in test:
t.b_id = <some id pointing to record of B>
基本上,完成以上步骤后,它将使用b中某个对象的id更新具有a_id记录的条目。
我遇到的问题
当我尝试运行makemigrations
时,它要求提供data字段的默认值,但我不确定应该放什么。在模型A中,我可以将data字段指向B的任何记录,但这样我将失去第三个表C的使用,而且表C广泛用于整个系统。
那么,我是否需要删除表C?
此外,想知道是否有更好的方法将多对多关系更改为一对多关系。
任何帮助都将很有用。