Python Django指示如何对多个发送方和多个实例执行post_save方法?

Python Django指示如何对多个发送方和多个实例执行post_save方法?,python,django,django-signals,Python,Django,Django Signals,我有两种型号Profile和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

我有两种型号
Profile
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()
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)
如您所见,
Profile
是一个用户模型扩展。当只发送一个实例时,我就可以正常工作了

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()
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
中的
name
字段保存到
Profile

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)

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

@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()

可能是我以前见过的复制品。我明白了,一个信号中可以使用多个发送器。我想知道如何在一个信号中传递多个实例
views.py
将提供更好的理解。Django内置信号无法处理这种情况。您应该构建自己的信号: