Django信号如何对多个发送者和多个实例执行post_save方法?

Kis*_*n M 4 python django django-signals

我有两个Profile模型Company

模型.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()
Run Code Online (Sandbox Code Playgroud)

如您所见,Profile这是一个 user_model 扩展。当我只发送一个实例时,我已经做到了这一点。

模型.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)
Run Code Online (Sandbox Code Playgroud)

Company创建成功。我想 在创建公司时将该name字段保存到CompanyThe中。Profile

视图.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)
Run Code Online (Sandbox Code Playgroud)

Saj*_*ier 6

根据您的模型架构,以下应该是基于信号的方法的代码。

@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()
Run Code Online (Sandbox Code Playgroud)