Значения не попадают в базу данных вместе с сигналами

Я использую сигнал для регистрации пользователя в таблице Profile, каждый раз, когда пользователь регистрируется в Django User. Я могу получить результаты имени пользователя и электронной почты, однако, имя и фамилия не присваиваются.

Модель 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

Сигнал 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)

Примечание: Я уже пытался создать все вместе, и моей мерой отчаяния была попытка обновления после создания.

Печать таблицы без фамилии и имени, но с указанием электронной почты.

enter image description here

Помогло бы, если бы вы использовали точку вместо скобки, потому что ваш user_db - это объект, а не словарь. (после удаления .values())

def new_profile(sender, instance, created, **kwargs):
    user_db = User.objects.filter(username__exact=instance).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)

В итоге мне удалось разрешить ситуацию. Проблема была в том, как django вводит данные в базу данных, видимо, он создает и после обновления. Вот решение:

@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,
    )
Вернуться на верх