2016-06-23 102 views
2

我需要獲取每個類,它繼承了models.Model以創建和更新字段。我可以通過爲每個字段添加自定義保存方法來實現此目的,但這違反了Don'tRepeatYourself規則。覆蓋模型中的每個類的保存方法。模型

我試圖重寫models.Model:

class LogModel(models.Model): 
    created = models.DateTimeField(editable=False) 
    updated = models.DateTimeField() 

    def save(self, *args, **kwargs): 
     if not self.id: 
      self.created = timezone.now() 
     self.updated = timezone.now() 
     return super(LogModel, self).save(*args, **kwargs) 

,並使用LogModel代替models.Model,但這種失敗,錯誤E006( 字段 'X' 的衝突與現場的 'X'從模式「y.logmodel」。

編輯

我的主要問題是如何將自定義特定領域在我的models.py添加到所有型號

+2

請確保您的縮進的問題,正確顯示,這樣你就不會在錯誤的事情得到反饋。 (對Python尤其重要。)另外,請詳細說明「沒有工作」的含義。你試過的時候究竟發生了什麼?它沒有保存過嗎?它默默地失敗了嗎?它是否拋出異常? –

回答

4

你的基礎模型必須是抽象:

class LogModel(models.Model): 

    class Meta: 
     abstract = True 

    created = models.DateTimeField(editable=False) 
    updated = models.DateTimeField() 

    def save(self, force_insert=False, force_update=False, using=None, update_fields=None): 
     # Use self._state.adding to check if this is a new instance, 
     # ID not being empty is not a guarantee that the instance 
     # exists in the database 
     # and if `update_fields` is passed, you must add the fields to the 
     # list or they won't be saved in the database. 
     if force_insert or self._state.adding: 
      self.created = timezone.now() 
      if update_fields and 'created' not in update_fields: 
       update_fields.append('created') 
     self.updated = timezone.now() 
     if update_fields and 'updated' not in update_fields: 
      update_fields.append('updated') 
     return super(LogModel, self).save(*args, **kwargs) 

但是,如果重寫save()方法,這意味着它不會以任何形式進行編輯。如果這是你想要的東西,那麼你最好使用auto_nowauto_now_add

class LogModel(models.Model): 

    class Meta: 
     abstract = True 

    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
0

而是覆蓋保存方法,你可以定義auto_now_addauto_now參數示範場,如:

created = models.DateTimeField(auto_now_add=True) 
updated = models.DateTimeField(auto_now=True) 

有關這些參數的更多信息,你可以檢查django docs

+0

我的主要問題是如何向所有模型添加特定字段。 –

+0

可以通過定義[抽象模型](https://docs.djangoproject.com/en/1.9/topics/db/models/#abstract-base-classes)並在其中定義保存方法並創建所有模型從抽象類繼承。 –

+0

謝謝。答案很簡單。 –

0

它可以通過定義Abstract Base Model來完成,並確定保存方法有通過從抽象類繼承創建的所有車型。例如從它

class MyAbstractModel(models.Model): 
    created = models.DateTimeField(editable=False) 
    updated = models.DateTimeField() 

    def save(self, *args, **kwargs): 
     if self._state.adding: 
      self.created = timezone.now() 
     self.updated = timezone.now() 
     return super(LogModel, self).save(*args, **kwargs) 

    class Meta: 
     abstract = True 

,並創建子模型類:

class Record(MyAbstractModel): 
    pass