我有一个传统的项目,它将用户存储在auth_user django表中。后来,我决定实现一个profiles
应用程序。views.py
代码如下
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
我做makemigrations
和migrate
。该表是用空数据创建的,也就是说,auth_user
中存在的以前的用户没有在profiles_profile
表中填充。如何在新表中填充旧数据?谢谢
发布于 2022-11-01 04:44:22
从用户模型中获取所有对象并使用shell保存到配置文件模型中。这是最简单的方法。
python manage.shell
然后导入模型用户和配置文件。
for user in User.objects.all():
profile=Profile()
profile.user=user
profile.save()
发布于 2022-11-01 06:32:02
这就是方法:在终端类型中:
python manage.py makemigrations --empty profiles
我使用配置文件,因为这是我的app_name。这将在应用程序的迁移文件夹中创建一个文件,例如,0005_auto_20221101_1518.py
在此文件中,键入以下内容:
from django.db import migrations
from django.conf import settings
def make_profiles(apps, schema_editor):
User = apps.get_model(settings.AUTH_USER_MODEL)
Profile = apps.get_model('profiles', 'Profile')
profiles = [Profile(user=user) for user in User.objects.filter(profile=None)]
Profile.objects.bulk_create(profiles)
class Migration(migrations.Migration):
dependencies = [
('profiles', '0004_merge_20221101_1507'),
]
operations = [
migrations.RunPython(make_profiles),
]
好的,在这里,你可以很容易地弄清楚。在我的例子中,概要文件是模型,概要文件是app_name。0004_merge_20221101_1507
对应于之前的迁移文件。这是自动设置的,所以不用担心,但是如果您使用迁移文件,那么这个文件应该是list...usually中的前一个文件,按0001.,0002,...0003,0004等顺序确定。
之后只有makemigrations
和migrate
。就这样..。但是,如果您的新表中有一个唯一的字段,例如基于用户的first_name和last_name的段塞,该怎么办?您可能有一个问题,因为两个用户可能共享相同的弹格字段。在这种情况下,迁移将显示一个错误。解决这个问题的方法很多,there....but不在这个答案的范围之内。干杯
https://stackoverflow.com/questions/74275893
复制相似问题