【问题标题】:Django : Signals with a extend User modelDjango:带有扩展用户模型的信号
【发布时间】:2017-11-01 10:55:08
【问题描述】:

我在 Django 1.11 中,我的问题很简单:
我读了这些帖子:

我不确定当用户存在时会创建/更新 StudentCollaborator 用户(数据库中已经有用户,所以我不能简单地重做东西)。

我当前的代码如下所示:

# Create your models here.
class StudentCollaborator(models.Model):
    #  https://docs.djangoproject.com/en/dev/topics/auth/customizing/#extending-the-existing-user-model
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    """" code postal : pour l'instant que integer"""
    code_postal = models.IntegerField(null=True, blank=False)
    """" flag pour dire si l'user a activé le système pour lui """
    collaborative_tool = models.BooleanField(default=False)
    """ Les settings par défaut pour ce user """
    settings = models.ForeignKey(CollaborativeSettings)

    def change_settings(self, new_settings):
        self.settings = new_settings
        self.save()

    """ https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#onetoone """
    """ Signaux: faire en sorte qu'un objet StudentCollaborator existe si on a un modele """
    @receiver(post_save, sender=User)
    def create_student_collaborator_profile(sender, instance, created, **kwargs):
        if created:
            """ On crée effectivement notre profile """
            StudentCollaborator.objects.create(
                user=instance,
                collaborative_tool=False,
                settings=CollaborativeSettings.objects.create()  # Initialisé avec les settings par défaut
            )

你能帮帮我吗?

谢谢

【问题讨论】:

  • 所以您想对模型进行更改?更改后您可以执行 manage.py makemigration 和 manager.py migrate 将现有用户数据迁移到新模型
  • 如果你想为已经存在的用户创建StudentCollaborator,你应该创建数据迁移,read here
  • 感谢您的回答。我不知道数据迁移处理扩展用户模型...
  • ...该死,数据库中没有简单的 StudentCollaborator 行^^

标签: python django python-2.7 django-models


【解决方案1】:

如果您正在寻找一种方法来为已经存在的其他用户创建StudentCollaborator,那么您只需通过代码即可。

您的信号仅在将新用户添加到用户模型时才有效,因此您必须为其他用户创建StudentCollaborator

这是一个简单的代码,您可以使用它为您的用户创建StudentCollaborator

users = User.objects.all()
for user in users:
    collaborator = StudentCollaborator.objects.filter(user=user)
    if collaborator.count() < 1:
        settings = CollaborativeSettings.objects.create()
        StudentCollaborator.objects.create(user=user, settings=settings)

您需要运行此代码一次,为您的用户创建一个 StudentCollaborator,然后您的信号将为新用户发送到该作业。

【讨论】:

  • 谢谢。我对你的回答唯一的问题:我应该在哪里运行这个东西?直接在控制台中^^?
  • @jy95 你可以在任何你想要的地方运行它。我曾经创建一个只有我可以访问和运行这类代码的安全 url,因为我必须进行许多更改,并且每次使用控制台都需要更多时间来编写视图中的代码并在浏览器中执行它。
【解决方案2】:

注册ORM对象处理器就好了。添加

objects = StudentCollaboratorManager()

到您的 StudentCollaborator 类。

然后定义:

class StudentCollaboratorManager(BaseUserManager):

    def create_user(self, username, email, password, code_postal, collaborative_tool, **extra_fields):
        baseuser = User.objects.create(username, email, password)
        )
        user = self.model(
            user=baseuser,
            collaborative_tool=collaborative_tool,
            code_postal=code_postal,
            **extra_fields
        )

        #baseuser.set_password(password) #not needed
        baseuser.save(using=self._db)
        user.save(using=self._db)

        return user

【讨论】:

  • 为现有用户创建StudentCollaborator 是否有帮助?
  • 其实没有。我认为当原始 User 类存在时,您在创建新 StudentCollaborator 实例时遇到问题。
【解决方案3】:

您可以覆盖 StudentCollaborator 模型的 save() 方法,只需检查实例的主键是否存在 (self.pk)。如果确实如此,则获取该 ModelInstance 并在 .save() 上更新 Instance

def save(self, *args, **kwargs):
    """Overwriting save method to avoid duplicate keys on new account creation."""
    if not self.pk:
        try:
            profile = StudentCollaborator.objects.get(user=self.user)
            self.pk = profile.pk
        except StudentCollaborator.DoesNotExist:
            pass

    super(StudentCollaborator, self).save(*args, **kwargs)

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2016-10-12
    • 2011-02-28
    • 2013-12-06
    • 2018-01-21
    • 2020-07-13
    • 2018-04-24
    相关资源
    最近更新 更多