I'm using a signal to register a user in the Profile table, every time a User is registered in the Django User. I'm able to get the results of username and email, however, the first and last name are not being assigned.
Model Perfil
class Perfil(models.Model):
username = models.OneToOneField(User, on_delete=models.CASCADE)
first_name = models.CharField(max_length=30, verbose_name="first name", blank=True)
last_name = models.CharField(max_length=30, verbose_name="last name", blank=True)
email = models.EmailField(max_length=75, verbose_name="email address", blank=True)
def __str__(self):
return self.username.username
Signal new_profile
def new_profile(sender, instance, created, **kwargs):
user_db = User.objects.filter(username__exact=instance).values().first()
if created:
Perfil.objects.create(
username = instance
)
Perfil.objects.filter(username__exact=instance).update(
first_name = user_db['first_name'],
last_name = user_db['last_name'],
email = user_db['email']
)
post_save.connect(new_profile, sender=User)
Note: I already tried to create with everything together and my measure of desperation was to try to update after having created.
Print of the table without the last_name and the first_name but with the email.
I ended up resolving the situation. The problem was in the way django injects data into the database, apparently, it creates and after the update. Here's the solution:
@receiver(post_save, sender=User)
def new_profile(sender, instance, created, **kwargs):
if created:
Perfil.objects.create(
username = instance,
email = instance.email,
)
else:
if not hasattr(instance, "Perfil"):
Perfil.objects.filter(username__exact=instance).update(
ultimo_nome = instance.last_name,
primeiro_nome = instance.first_name,
)