Search code examples
pythondjangodjango-rest-frameworksignals

Values ​are not going to the database with signals


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.

enter image description here


Solution

  • 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,
        )