簡體   English   中英

如何在django中發出可以區分put和post方法的信號?

[英]How can i make signals in django which can differentiate between put and post method?

我正在使用in_built Django用戶,並希望為每個添加的用戶生成通知,但是我不希望在put請求上生成通知。它應該僅在post請求上生成。 我的模特是...

型號

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

現在的問題是,每次執行放置或發布請求時,它都會保存用戶實例,因此會創建一個Notification對象。我只想在創建新用戶時創建Notification。

假設您將串行化器用於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方法,該方法將同時接受UserNotification模型的字段:

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的參數,該參數是

一個布爾值; 如果創建了新記錄,則為True。

您可以使用它來區分是創建新記錄還是剛剛更新新記錄。

文檔中的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM