我正在尝试从某些模型中删除现有的GenericForeignKey关系。我想将其更改为下面的重新格式化模型。迁移是否提供了将现有content_type和object_ids转换为相应的新ForeignKey的方法? (保留现有数据)。基本上是编程的全新,所以请原谅我,如果我问一个愚蠢的问题。
static_if
重新格式化的模型
class Donation(models.Model):
amount_id = models.CharField(max_length=12, unique=True, editable=False)
date_issued=models.DateField(auto_now_add=True)
description=models.TextField(blank=True, null=True)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type','object_id')
class Individual(BaseModel):
first_name = models.CharField(max_length=50)
middle_name = models.CharField(max_length=50, blank=True,
null=True)
last_name = models.CharField(max_length=50)
suffix = models.CharField(max_length=50, blank=True, null=True)
contributor = generic.GenericRelation(Donation, related_query_name='individual')
class Organization(models.Model):
name = models.CharField(max_length=100)
contributor = generic.GenericRelation(Donation, related_query_name='organization')
答案 0 :(得分:0)
根据捐赠模型的模型定义,其中一个字段contributor_group,contributor_model将始终为Null迁移后。 我希望你考虑到这一点。
为了安全起见分两个阶段进行。 1.保留content_type和object_id并添加两个新字段。 2.下一步删除发布数据填充的通用字段。
有两种方法可以填充这些新字段
Django迁移为您提供了一种在迁移过程中使用值填充新字段的方法。你可以查查看。我之前没有这样做过。
更多控制和一些学习。您也可以通过脚本填充它。您可以在项目中设置django-extensions模块。并写一个脚本来为你做那些人口。示例脚本看起来像。
来自myproject.models的导入捐赠,个人,组织 来自django.contrib.contenttypes.models import ContentType
def run(): organization_content_type = ContentType.objects.get_for_model(组织) individual_content_type = ContentType.obejcts.get_for_model(个人)
donations = Donation.objects.all()
for donation in donations:
if donation.content_type_id == organization_content_type.id:
donation.contributor_group = donation.object_id
elif donation.content_type_id == individual_content_type.id:
donation.contributor_individual = donation.object_id
else:
print "Can't identify content type for donation id {}".format(donation.id)
donation.save()
检查值是否正确,然后删除通用字段。 在这里面对格式化的一些问题。