python - Django - 为所有现有用户创建配置文件
问题描述
我正在使用 Django 3,这是我的用户配置文件模型
from django.db import models
from django.contrib.auth.models import User
from datetime import datetime
from django.db.models.signals import post_save
from django.utils.text import slugify
from django.db.models import signals
# Create your models here.
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(max_length=1000,blank=True)
created_at = models.DateTimeField(default=datetime.now())
slug = models.SlugField(blank=True)
img = models.ImageField(upload_to='userimg/',default='userimg/avatar.png')
def __str__(self):
return "%s" % self.user
def save(self, *args, **kwargs):
self.slug = slugify(self.user)
super(Profile, self).save(*args, **kwargs)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.get(user=instance)
post_save.connect(create_user_profile, sender=User)
def delete_user(sender, instance=None, **kwargs):
try:
instance.user
except User.DoesNotExist:
pass
else:
instance.user.delete()
signals.post_delete.connect(delete_user, sender=Profile)
问题是函数 create_user_profile 仅为新用户创建配置文件,但不为旧用户创建配置文件,那么我该如何解决呢?
解决方案
您可以进行数据迁移。您创建一个:
python3 manage.py makemigrations --empty app_name
您替换app_name
为存储Profile
模型的应用程序的名称。在迁移中,您可以制作Profile
模型:
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('app_name', 'Profile')
profiles = [Profile(user=user) for user in User.objects.filter(profile=None)]
Profile.objects.bulk_create(profiles)
class Migration(migrations.Migration):
dependencies = [
('app_name', '1234_some_migration'),
]
operations = [
migrations.RunPython(make_profiles),
]
注意:通常使用
settings.AUTH_USER_MODEL
[Django-doc]引用用户模型比直接使用User
模型 [Django-doc]更好。有关更多信息,您可以查看文档的引用User
模型部分。
推荐阅读
- postgresql - POSTGRES_PASSWORD 被忽略并且可以在没有或使用任何密码的情况下访问数据库
- c++ - C++ while 循环和 for 循环不起作用
- javascript - 在 java 脚本中调用 AWS REST API
- github - Azure DevOps Build Pipeline 与 GitHub 中的存储库
- javascript - 我如何在 React js 中更改对象数组的状态
- excel - 使用 Worksheets.Activate 语法时下标超出范围错误
- mysql - 获取按两列分组的最小值/最大值
- pandas - 熊猫系列移位和条件返回系列的真值不明确
- haskell - 可执行文件找不到导入的模块
- ios - Is there a simple way to temporarily disable the physics bodies for a sprite in Swift? (SpriteKit)