创建一个与现有模型具有一对一关系的新模型Django

bsxbgnwa  于 2022-11-18  发布在  Go
关注(0)|答案(1)|浏览(147)

我想通过一对一字段将Profile模型关系添加到现有的User模型中。但是我在数据库中已经有几个用户。如何在迁移新模型的同时创建这些默认关系?
例如,我已经在数据库中创建了两个用户Foo和Bar,在迁移Profile模型之后,这两个用户都应该有一个关联的Profile

型号

class User(AbstractBaseUser, PermissionsMixin):

    email = models.EmailField(verbose_name="Email Address", max_length=255, unique=True)
    first_name = models.CharField(max_length=255)
    surname = models.CharField(max_length=255)

    is_active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["first_name", "surname"]

    def get_full_name(self):
        return f"{self.first_name} {self.surname}"

    def __str__(self):
        return self.email

    def is_staff(self):
        return self.staff

    def is_admin(self):
        return self.admin

### New model I want to create
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    avatar = models.ImageField(default="gravatar.jpg", upload_to="avatars/")
    username = models.CharField(max_length=255, blank=True)
    phone = models.CharField(max_length=15, blank=True)

    def __str__(self):
        return f"{self.user.first_name}'s profile"
zpjtge22

zpjtge221#

在新创建的迁移文件中,只需包含一个RunPython脚本,该脚本将为现有用户创建相关的Profile对象:

# xxxx_migration.py file

from django.db import migrations

def create_profiles(apps, schema_editor):
    User = apps.get_model(<app_name>, 'User')
    Profile = apps.get_model(<app_name>, 'Profile')
    users = User.objects.filter(profile__isnull=True)
    Profile.objects.bulk_create(
        [Profile(user=user, username=user.email) for user in users]
    )

class Migration(migrations.Migration):
    dependencies = [<migration_dependencies>]

    operations = [
        migrations.CreateModel(
            name='Profile',
            fields=[...]
        ),

        # Create profile objects
        migrations.RunPython(create_profiles, reverse_code=migrations.RunPython.noop)
    ]

在此处了解有关迁移中的自定义脚本的详细信息

相关问题