我如何在 django 中发出可以区分 put 和 post 方法的信号?
How can i make signals in django which can differentiate between put and post method?
我正在使用 in_built Django 用户并希望为每个添加的用户生成通知,但我不希望在 put
上生成通知 request.It 应该只在 [= 上生成14=] 请求。
我的模型是...
Models.py
class User(AbstractUser):
gender= models.CharField(choices=GENDER, max_length=10, null=True, blank=True)
role= models.CharField(choices=ROLE_CHOICE, max_length=15, null=True, blank=True)
designation=models.CharField(max_length=225,null=True,blank=True)
employee_id = models.CharField(max_length=20, default=None, null=True)
class Notification(models.Model):
text = models.CharField(max_length=225)
recipient=models.ForeignKey(User,related_name='notification')
timestamp = models.DateTimeField(null=True,blank=True,auto_now_add=True)
unread = models.BooleanField(default=True, blank=False)
send_by= models.ForeignKey(User, null=True,blank=True, related_name='Notification')
在我的信号中,我做出了这样的......
Signals.py
@receiver(post_save, sender= Any_model)
def comment_recieved(sender,**kwargs):
obj= kwargs.get('instance')
recipient=User.objects.get(is_superuser=True)
Notification.objects.create(
recipient= recipient,
comment= obj,
project=obj.project,
type="commented",
send_by=obj.supporter,
text= "%s has commented on %s" % (obj.supporter, obj.project)
)
return None
现在的问题是,每次您执行放置或 post 请求时,它都会保存用户实例,因此会创建一个通知 object.I 只想在创建新用户时创建通知.
假设您将序列化程序用于 DRF 视图,这样您就可以覆盖用户序列化程序的 create()
方法。
class UserSerializer(serializer.ModelSerializer):
...
def create(self, validated_data):
user = User.objects.create(**validated_data)
Notification.objects.create( # fill your fields here )
return user
但更明确的解决方案是编写自定义管理器并在那里覆盖 create
方法,它将接受 User
和 Notification
模型的两个字段:
class UserManager(models.Manager):
...
def create(self, gender, role ... type #and so on):
user = User(
gender=gender
role=role
...
# other fields
)
user.save()
notification = Notification(
type=type
..
# other fields
)
notification.save()
return user
class User(models.Model):
....
objects = UserManager()
序列化程序:
class UserSerializer(serializer.ModelSerializer):
...
def create(self, validated_data):
return User.objects.create(
gender=validated_data.get('gender')
role=validated_data.get('role')
....
type = validated_data.get('type')
post_save
信号发送一个名为 created
的参数,即
A boolean; True if a new record was created.
您可以使用它来区分新记录是创建的还是刚刚更新的。
我正在使用 in_built Django 用户并希望为每个添加的用户生成通知,但我不希望在 put
上生成通知 request.It 应该只在 [= 上生成14=] 请求。
我的模型是...
Models.py
class User(AbstractUser):
gender= models.CharField(choices=GENDER, max_length=10, null=True, blank=True)
role= models.CharField(choices=ROLE_CHOICE, max_length=15, null=True, blank=True)
designation=models.CharField(max_length=225,null=True,blank=True)
employee_id = models.CharField(max_length=20, default=None, null=True)
class Notification(models.Model):
text = models.CharField(max_length=225)
recipient=models.ForeignKey(User,related_name='notification')
timestamp = models.DateTimeField(null=True,blank=True,auto_now_add=True)
unread = models.BooleanField(default=True, blank=False)
send_by= models.ForeignKey(User, null=True,blank=True, related_name='Notification')
在我的信号中,我做出了这样的......
Signals.py
@receiver(post_save, sender= Any_model)
def comment_recieved(sender,**kwargs):
obj= kwargs.get('instance')
recipient=User.objects.get(is_superuser=True)
Notification.objects.create(
recipient= recipient,
comment= obj,
project=obj.project,
type="commented",
send_by=obj.supporter,
text= "%s has commented on %s" % (obj.supporter, obj.project)
)
return None
现在的问题是,每次您执行放置或 post 请求时,它都会保存用户实例,因此会创建一个通知 object.I 只想在创建新用户时创建通知.
假设您将序列化程序用于 DRF 视图,这样您就可以覆盖用户序列化程序的 create()
方法。
class UserSerializer(serializer.ModelSerializer):
...
def create(self, validated_data):
user = User.objects.create(**validated_data)
Notification.objects.create( # fill your fields here )
return user
但更明确的解决方案是编写自定义管理器并在那里覆盖 create
方法,它将接受 User
和 Notification
模型的两个字段:
class UserManager(models.Manager):
...
def create(self, gender, role ... type #and so on):
user = User(
gender=gender
role=role
...
# other fields
)
user.save()
notification = Notification(
type=type
..
# other fields
)
notification.save()
return user
class User(models.Model):
....
objects = UserManager()
序列化程序:
class UserSerializer(serializer.ModelSerializer):
...
def create(self, validated_data):
return User.objects.create(
gender=validated_data.get('gender')
role=validated_data.get('role')
....
type = validated_data.get('type')
post_save
信号发送一个名为 created
的参数,即
A boolean; True if a new record was created.
您可以使用它来区分新记录是创建的还是刚刚更新的。