Seite 1 von 1

[Django] auto_now / auto_now_add "überschreiben"...

Verfasst: Mittwoch 21. September 2011, 13:24
von jens
ich nutzte auto_now / auto_now_add in einem Model, zb:

Code: Alles auswählen

class UpdateInfoBaseModel(models.Model):
    createtime = models.DateTimeField(auto_now_add=True)
    lastupdatetime = models.DateTimeField(auto_now=True)
Nun möchte ich bei einigen Einträgen eigene Zeiten eintragen. Also Quasi auto_now / auto_now_add temporär deaktivieren...

Mir ist das eingefallen:

Code: Alles auswählen

                for field in new_entry._meta.local_fields:
                    if field.name == "lastupdatetime":
                        field.auto_now = False
                    elif field.name == "createtime":
                        field.auto_now_add = False

                new_entry.createtime = date
                new_entry.lastupdatetime = date
                new_entry.save()

                for field in new_entry._meta.local_fields:
                    if field.name == "lastupdatetime":
                        field.auto_now = True
                    elif field.name == "createtime":
                        field.auto_now_add = True
(siehe auch https://gist.github.com/1231898 )

Aber schön ist das nicht. Geht's einfacher?

EDIT: Das ganze brauche ich nur für eine einmalige Migration. Somit soll es bei auto_now / auto_now_add bleiben...

EDIT2: Siehe auch: http://stackoverflow.com/questions/7499 ... to-now-add

Re: [Django] auto_now / auto_now_add "überschreiben"...

Verfasst: Donnerstag 22. September 2011, 14:58
von Dauerbaustelle
`DateTimeField` subklassen und `pre_save` ersetzen durch

Code: Alles auswählen

def pre_save(self, *args, **kwargs):
    return super(DateTimeField, self).pre_save(*args, **kwargs)

Re: [Django] auto_now / auto_now_add "überschreiben"...

Verfasst: Donnerstag 22. September 2011, 20:22
von apollo13
Warum überhaupt auto_now* verwenden? Ich mach das immer in der save methode selbst, somit kann ichs im admin anzeigen und falls nötig über ein keyword arg temporär deaktivieren…

Re: [Django] auto_now / auto_now_add "überschreiben"...

Verfasst: Freitag 23. September 2011, 07:29
von jens
Ja, ich denke auch, auf langer Sicht werde ich das abschaffen. Aber es gibt wichtigeres zu tun ;)

Re: [Django] auto_now / auto_now_add "überschreiben"...

Verfasst: Freitag 20. Juli 2012, 11:27
von jens
Ich brauche das wieder für die phpBB2DjangoBB migration und hab eine erweiterte Variante gebaut:

Code: Alles auswählen

def disable_auto_fields(model_class):
    ATTR_NAMES = ("auto_now", "auto_now_add")
    for field in model_class._meta.local_fields:
        for attr_name in ATTR_NAMES:
            if getattr(field, attr_name, False) == True:
                print "Disable '%s' on field %s.%s" % (attr_name, model_class.__name__, field.name)
                setattr(field, attr_name, False)

Re: [Django] auto_now / auto_now_add "überschreiben"...

Verfasst: Freitag 20. Juli 2012, 18:44
von apollo13
Allerdings alles andere als Threadsafe…

EDIT:// Wobei ich seh grad du tust damit nur deaktivieren, mein Fehler.