我在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
)
你能帮助我吗?
由于
答案 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)