Значения не попадают в базу данных вместе с сигналами
Я использую сигнал для регистрации пользователя в таблице 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)
Примечание: Я уже пытался создать все вместе, и моей мерой отчаяния была попытка обновления после создания.
Печать таблицы без фамилии и имени, но с указанием электронной почты.
Помогло бы, если бы вы использовали точку вместо скобки, потому что ваш 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,
)