2017-07-13 106 views
0

我正在一個Django模型,我想每一個它的變量發生變化時觸發功能。這裏是我的模型:觸發功能在Django模型的變量的變化

class Cv(models.Model): 
    name = models.CharField(max_length=100) 
    position = models.ForeignKey(
     OpenPosition, 
     on_delete=models.CASCADE, 
     null=True, 
    ) 
    team = models.ForeignKey(
     Team, 
     on_delete=models.CASCADE, 
     null=True 
    ) 
    leader = models.ForeignKey(Leader, on_delete=models.CASCADE) 

    email = models.EmailField(
     max_length=100, 
     null=False, 
     validators=[EmailValidator()], 
     blank=True 
    ) 
    email_sent_status = models.BooleanField(default=False) 
    phone = models.CharField(
     validators=[ 
      RegexValidator(
       regex=r'^(0\d{9,11})$', 
       message=''' 
       Phone number must be started with 0 and has 10-12 digits 
       ''' 
      )], 
     blank=True, 
     null=True, 
     max_length=20, 
    ) 
    link = models.CharField(
     max_length=150, 
     validators=[URLValidator()], 
    ) 
    source = models.ForeignKey(CvSource, on_delete=models.CASCADE) 
    cv_status = models.CharField(
     max_length=10, 
     choices=STATUS, 
     default='u', 
    ) 
    schedule = models.DateTimeField(blank=True, null=True) 
    schedule_confirm = models.BooleanField(default=False) 
    interview_status = models.CharField(
     max_length=10, 
     choices=FULL_STATUS, 
     default='u', 
    ) 
    test_status = models.CharField(
     max_length=10, 
     choices=STATUS, 
     default='u', 
    ) 
    test_comment = models.TextField(max_length=200, blank=True) 
    decision_status = models.CharField(
     max_length=10, 
     choices=FULL_STATUS, 
     default='u', 
    ) 
    offer_status = models.CharField(
     max_length=10, 
     choices=OFFER_STATUS, 
     default='u,' 
    ) 
    internal_comment = models.TextField(max_length=200, blank=True) 
    created_at = models.DateTimeField(
     editable=False, 
     null=True, 
    ) 
    updated_by = models.CharField(max_length=30, editable=False, null=True) 

目前我使用的是Django: When saving, how can you check if a field has changed?提及,但諸多變數此過程中成爲重複的方法:

def __init__(self, *args, **kwargs): 
    super(Cv, self).__init__(*args, **kwargs) 
    #override original fields' values with current values 
    self.__original_schedule = self.schedule 
    self.__original_schedule_confirm = self.schedule_confirm 
    self.__original_name = self.name 
    self.__original_position = self.position 
    self.__original_team = self.team 
    self.__original_leader = self.leader 
    self.__original_email = self.email 
    self.__original_email_sent_status = self.email_sent_status 
    self.__original_phone = self.phone 
    #etc 

def save(self, *args, **kwargs): 
    if self.__original_schedule != self.schedule: 
     #do something etc 

我想找到一種方法來優化這個過程。我讀的地方,你可以使用@property跟蹤變量的變化,我想知道如果我能在我的模型中使用此方法。如果沒有,是否有任何其他方式,我可以提高我的方法。

+0

使用性質可能與Django的ORM等神奇功效干涉。但是,你有很多選擇:信號,驗證,覆蓋'保存()',setter方法... –

回答

2

爲什麼不是django信號see docs here

post_save每次保存模型對象時都會觸發信號。

工作例如:

在你的models.py添加..

from django.db.models.signals import post_save 
from django.dispatch import receiver 

@receiver(post_save, sender=Cv) 
def hear_signal(sender , instance , **kwargs): 
    if kwargs.get('created'): 
     return # if a new model object is created then return. You need to distinguish between a new object created and the one that just got updated. 

    #Do whatever you want. 
    #Your trigger function content. 
    #Parameter "instance" will have access to all the attributes of the model being saved. To quote from docs : It's "The actual instance being saved."   

    return 

感謝。希望這可以幫助。