Kishan M
Kishan M

Reputation: 173

Django signals How to perform post_save method with multiple senders and multiple instances?

I have two models Profile and Company

models.py

class Profile(models.Model):
    user = models.OneToOneField(User)
    company = models.ForeignKey('company.Company', null=True)
    phone = models.CharField(max_length=10, blank=True)

@receiver(post_save, sender=User)
@receiver(post_save, sender=Company)
def update_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
        Profile.objects.create(company=instance)
    instance.profile.save()

As you can see Profile is an user_model extension. I have got that working when sending only one instance.

models.py

class Company(models.Model):
    user = models.OneToOneField(User)
    name = models.CharField(max_length=10, blank=True, unique=True)
    phone = models.CharField(max_length=10, blank=True)

Company is created successfully. I want to save the name field in the Company to The Profile when a company is created.

views.py

def form_valid(self, form):
    company = form.save(commit=False)
    user = self.request.user
    name=form.cleaned_data['name']
    phone=form.cleaned_data['phone']
    company.name = name
    company.phone = phone
    company.user = user
    company.save()
    Profile.refresh_from_db()
    Profile.company = name
    Profile.save()
    return super(CompanyCreateView, self).form_valid(form)

Upvotes: 4

Views: 3999

Answers (1)

Saji Xavier
Saji Xavier

Reputation: 2370

According to your model architecture, following should be the code for the signal based approach.

@receiver(post_save, sender=User)
@receiver(post_save, sender=Company)
def update_user_profile(sender, instance, created, **kwargs):
    if created:
        if sender.__name__ == 'User':
            Profile.objects.create(user=instance)
        # Company
        else:
            profile = Profile.objects.get(user=instance.user)
            profile.company = instance
            profile.save()

Upvotes: 6

Related Questions