2016-06-30 5 views
1

ich habe ein Modell, wie folgt aus:wie django 'auto_now' das Update der angegebenen Feld ignorieren

name = models.CharField(max_length=255) 
    modify_time = models.DateTimeField(auto_now=True) 
    chasha = models.CharField(max_length=255) 
    stat = models.CharField(max_length=255) 

Normalerweise 'modify_time' aktualisiert wird, wenn i 'name' aktualisieren 'Chasha', stat‘ ' Feld. Aber ich wollte nicht, dass 'modify_time' aktualisiert wurde, wenn ich 'stat' update. wie kann ich das machen?

danke.

Antwort

0

Verwenden Sie eine benutzerdefinierte Speichermethode, um das Feld zu aktualisieren, indem Sie eine vorherige Instanz anzeigen.

from django.db import models 
from django.utils import timezone as tz 


class MyModel(models.Model): 
    name = models.CharField(max_length=255) 
    modify_time = models.DateTimeField(null=True, blank=True) 
    chasha = models.CharField(max_length=255) 
    stat = models.CharField(max_length=255) 

    def save(self, *args, **kwargs): 
     if self.pk: # object already exists in db 
      old_model = MyModel.objects.get(pk=self.pk) 
      for i in ('name', 'chasha'): # check for name or chasha changes 
       if getattr(old_model, i, None) != getattr(self, i, None): 
        self.modify_time = tz.now() # assign modify_time 
     else: 
      modify_time = tz.now() # if new save, write modify_time 
     super(MyModel, self).save(*args, **kwargs) # call the inherited save method 

bearbeiten: auto_now von modify_time wie oben entfernen, sonst wird es bei dem Verfahren speichert eingestellt werden.

+1

das hilft viel, danke! –

+0

Danke @ shiji.hz und willkommen bei StackOverflow. Achten Sie darauf, das Kontrollkästchen neben einer Antwort für Ihre Frage zu aktivieren, wenn Sie das Problem gelöst haben. Dadurch wird die Frage aus der Warteschlange "unbeantwortete" entfernt. Upvote alles, was Ihnen besonders nützlich war. Fröhliches Django-Ing! –

Verwandte Themen