Django:将GenericForeignKey关系转换为ForeignKey关系

时间:2017-01-26 17:12:04

标签: django

我正在尝试从某些模型中删除现有的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')

1 个答案:

答案 0 :(得分:0)

根据捐赠模型的模型定义,其中一个字段contributor_group,contributor_model将始终为Null迁移后。 我希望你考虑到这一点。

为了安全起见分两个阶段进行。 1.保留content_type和object_id并添加两个新字段。 2.下一步删除发布数据填充的通用字段。

有两种方法可以填充这些新字段

  1. Django迁移为您提供了一种在迁移过程中使用值填充新字段的方法。你可以查查看。我之前没有这样做过。

  2. 更多控制和一些学习。您也可以通过脚本填充它。您可以在项目中设置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()
    
  3. 检查值是否正确,然后删​​除通用字段。 在这里面对格式化的一些问题。