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

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

`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)
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

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…
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ja, ich denke auch, auf langer Sicht werde ich das abschaffen. Aber es gibt wichtigeres zu tun ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Allerdings alles andere als Threadsafe…

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