【问题标题】:Django - create profile for all existing usersDjango - 为所有现有用户创建配置文件
【发布时间】:2020-06-06 13:09:18
【问题描述】:

我正在使用 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 只为新用户创建配置文件,但不为旧用户创建配置文件,那么我该如何解决这个问题?

【问题讨论】:

  • 您可以制作编辑配置文件表单并让用户为旧用户手动添加它..我认为唯一的解决方案
  • 我正在寻找一种自动的方式,我不想手动这样做
  • @Ninou:首先,很好地使用信号是一种反模式:lincolnloop.com/blog/django-anti-patterns-signals

标签: python django backend django-users django-3.0


【解决方案1】:

您可以创建data migration。你创建一个:

python3 manage.py makemigrations <b>--empty</b> <i>app_name</i>

您将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 model [Django-doc] 更好。更多信息可以查看referencing the User model section of the documentation

【讨论】:

  • @Ninou:不,如前所述,那是一个迁移文件。运行makemigrations 后,它会将Profiles 添加到缺少配置文件的Users 中。这将如何“适合”模型?
  • 我按照你说的做了,但是当我执行 py manage.py migrate 时,它​​向我显示了这个错误“LookupError: No installed app with label 'django.contrib.auth'。”我不知道为什么因为我在 INSTALLED_APPS 中有“django.contrib.auth”
  • @Ninou:如果你改用AUTH_USER_MODEL 设置呢?
  • 什么意思?
  • @Ninou:如果你改用User = apps.get_model(settings.AUTH_USER_MODEL)呢?
猜你喜欢
  • 2016-12-03
  • 2019-05-23
  • 1970-01-01
  • 2020-08-18
  • 2012-07-14
  • 2016-04-10
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多