如何解决Django-触发对象创建并保存在不同模型中的信号
所以我在项目中有这个自定义用户模型。
我希望用户可以注册为Profile
和Client
。我从自定义User
模型创建了两个不同的模型。
问题是,每次我从client
表单注册时,它也保存到Profile
模型中,而相反。
在我的accounts
应用中说:
# model.py
class User(AbstractUser):
username = models.CharField(max_length=100,unique=True)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
email = models.EmailField()
phone = models.CharField(max_length=20)
gender = models.CharField(choices=GENDER,max_length=10)
class Meta:
db_table = 'auth_user'
def __str__(self):
return self.username
class Profile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
...
email = models.CharField(blank=False,null=False,max_length=100)
phone = models.CharField(blank=True,null=True,max_length=14)
class Meta:
verbose_name = 'Influencer Profile'
def __str__(self):
return f'{self.user.username} Profile'
def save(self,*args,**kwargs):
super().save(*args,**kwargs)
然后在我的client
应用中:
# model.py
from accounts.models import User
class Client(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
...
company_name = models.CharField(max_length=50,unique=True)
class Meta:
verbose_name = 'Client Profile'
def __str__(self):
return f'{self.username} Client Profile'
def save(self,**kwargs)
我的signals.py
如下:
accounts/signals.py
@receiver(post_save,sender=User)
def create_profile(sender,instance,created,**kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save,sender=User)
def save_profile(sender,**kwargs):
instance.profile.save()
在我的signals
应用中还有一个clients
:
@receiver(post_save,sender=User)
def create_client_profile(sender,**kwargs):
if created:
Client.objects.create(user=instance)
@receiver(post_save,sender=Client) #using User as a sender but didn't work.
def save_client_profile(sender,**kwargs):
instance.client.save()
如何将用户注册保存到这些models
而不互相影响?我还为每个应用程序使用两种不同的注册表格。如果用户从client
表单进行注册,则应将其保存在client
模型中,而不要同时保存在两个模型(accounts
和clients
)中,依此类推。
解决方法
这就是信号在Django中的工作方式。创建User
模型时,无论使用哪种形式创建User
,都会调用所有注册的接收者。
是否可以以概要文件创建形式创建Profile
对象和以客户端创建形式创建Client
对象,而不使用信号?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。