Django:扩展用户模型

时间:2017-11-01 10:55:08

标签: python django python-2.7 django-models

我在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
            )

你能帮助我吗?

由于

3 个答案:

答案 0 :(得分:0)

如果您注册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

答案 1 :(得分:0)

如果您正在寻找一种为已经存在的其他用户创建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,之后您的信号将为新用户提供此作业。

答案 2 :(得分:0)

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

上的实例
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)