2016-12-30 4 views
1

私はin_built Djangoユーザーを使用しており、追加されたユーザーごとに通知を生成したいのですが、putリクエストで通知を生成したくありません。postリクエストでのみ生成する必要があります。 私のモデルは....どうすればdjangoでputメソッドとpostメソッドを区別できるシグナルを作ることができますか?

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') 

と私は次のように行われてきた私の信号で ...

@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 
Signals.py

です

問題は、put要求またはpost要求を行うたびに、ユーザーインスタンスと通知オブジェクトを作成します。新しいユーザーが作成されたときにのみ通知を作成します。

答えて

1

post_saveシグナルはcreatedという

という引数を送信します

ブール値。新しいレコードが作成された場合はtrue。

これを使用して、新しいレコードが作成されたかどうかを区別することができます。

More info in the docs

1

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 

しかし、もっと明確な解決策は、カスタムマネージャを書き込み、Userのための両方のフィールドを受け入れるがcreateメソッドをオーバーライドしている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() 

シリアライザ:

関連する問題