gpt4 book ai didi

python - 删除模型继承并将 id 保留在新创建的自动字段中

转载 作者:行者123 更新时间:2023-11-29 11:51:29 25 4
gpt4 key购买 nike

我有一个继承自非抽象 super 模型的模型:

class Person(models.Model):
pass

class User(Person):
pass

由于概念错误,我们想删除 Person 模型并将所有人员数据复制给用户。主要问题涉及“id”AutoField。

用户模型没有任何由 django 自动创建的 id 字段。由于继承,用户的主键是“person_ptr_id”。

我正在尝试进行数据库迁移。 Django 迁移想要将“id”字段添加为 AutoField 但要求提供默认值。我想要从每个用户记录的 person_ptr_id 复制初始值。我还希望 postgres 序列与值同步。

您是否已经执行过此类迁移?

最佳答案

我终于成功地完成了这些迁移:

1) 通过注释删除person_ptr 的列和创建'id' 的列来更改django 的自动迁移。然后添加一个“id”列作为整数:

migrations.AddField(
model_name='user',
name='id',
field=models.IntegerField(null=True)
),

2) 创建一个新的空迁移,用于将数据从个人迁移到用户,删除 person_ptr 字段并将“id”类型更改为 AutoField

def copy_persons_data(apps, schema_editor):
User = apps.get_model("accounts", "User")
Person = apps.get_model("persons", "Person")
for user in User.objects.all():
person = Person.objects.get(id=user.person_ptr_id)
user.new_field1 = person.new_field1
user.new_field2 = person.new_field2
user.id = person.id
user.save()

class Migration(migrations.Migration):

dependencies = [
('accounts', '0026_auto_20170606_1524'),
]

operations = [
migrations.RunPython(copy_persons_data, reverse_code=migrations.RunPython.noop),
migrations.RemoveField(
model_name='user',
name='person_ptr',
),
migrations.AlterField(
model_name='user',
name='id',
field=models.AutoField(auto_created=True, null=False, primary_key=True, serialize=False, verbose_name='ID'),
preserve_default=False,
),
]

这样做,django 会自动为“id”字段创建与最大 id 同步的序列。

注释:

在数据迁移函数中使用 user.person_ptr 会使 django 拒绝保存用户,因为没有保存 person 实例。所以我做了一个获取查询来获取用户的个人实例。

perserve_default=false 对于避免 django 需要新的迁移来删除自动字段的默认值很重要

关于python - 删除模型继承并将 id 保留在新创建的自动字段中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44406839/

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