richtige Verwendung von "auto_now_add=True"

Django, Flask, Bottle, WSGI, CGI…
Antworten
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Ich möchte in meiner Tabelle "Zähler" eine Feld

Code: Alles auswählen

letzte = models.DateTimeField('Letzter Aufruf', auto_now_add=True)

ergänzen - traue mich aber nicht so recht.
Immer, wenn ein Zähler-Objekt (oder ist das eine Instanz) geöffnet oder erzeugt wird, möchte ich in ihm das aktuelle Datum speichern. Ist dafür "auto_now" oder auto_now_add" richtig?
Aber vor Allem: was passiert mit den bestehenden Objekten (Instanzen?) wenn ich auf "migrate" klicke? Da habe ich schon oft vor Problemen gestanden. Muss ich da ein default festlegen?
Benutzeravatar
noisefloor
User
Beiträge: 3857
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

siehe [https://docs.djangoproject.com/en/4.2/r ... #datefield]. `auto_add` erzeugt einen Zeitstempel, wenn die Instanz angelegt und gespeichert wird. `auto_add_now` macht das auch plus aktualisiert den Zeitstempel, wenn die Instanz aktualisiert und gespeichert wird.

Bzgl. Migrationen: keine Ahnung, probier's aus. Wenn ein Default werde abgefragt würde - was IMHO keinen Sinn macht - kannst du die Migration ja immer noch beenden.

Gruß, noisefloor
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Ich habe es ausprobiert. Schon makemigation wirft einen Fehler:

Code: Alles auswählen

It is impossible to add the field 'letzte' with 'auto_now_add=True' to zaehler without providing a default. This is because the database needs something to populate existing rows.
Hat jemand eine Idee, was ich als default nehmen könnte? now() geht nicht. Möglich wäre der 1.8.2022. Ich bin aber unsicher wie ich das formatieren soll... "date(2022,8,1,0,0)"?
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Ein default will makemigration auch nicht:

Code: Alles auswählen

core.Zaehler.letzte: (fields.E160) The options auto_now, auto_now_add, and default are mutually exclusive. Only one of these options may be present.
Ich habe also bei

Code: Alles auswählen

 1) Provide a one-off default now which will be set on all existing rows
 2) Quit and manually define a default value in models.py.
Select an option: 1
mehrere Möglichkeiten ausprobiert. "null", "None" und "" will er nicht. "now()" würde akkzeptiert werden

Code: Alles auswählen

The datetime and django.utils.timezone modules are available, so it is possible to provide e.g. timezone.now as a value.

"now()" will ich aber nicht. Wie gebe ich hier das Datum "1.8.2023" korrekt ein?
Benutzeravatar
noisefloor
User
Beiträge: 3857
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

so:

Code: Alles auswählen

noisefloor@JSCH-DUT-1647nb:~/code/django42_venv/dut$ python3 manage.py makemigrations wgw
It is impossible to add the field 'edited' with 'auto_now_add=True' to castproduct without providing a default. This is because the database needs something to populate existing rows.
 1) Provide a one-off default now which will be set on all existing rows
 2) Quit and manually define a default value in models.py.
Select an option: 1
Please enter the default value as valid Python.
Accept the default 'timezone.now' by pressing 'Enter' or provide another value.
The datetime and django.utils.timezone modules are available, so it is possible to provide e.g. timezone.now as a value.
Type 'exit' to exit this prompt
[default: timezone.now] >>> datetime.datetime(2022, 8, 1)
Migrations for 'wgw':
  wgw/migrations/0008_castproduct_edited.py
    - Add field edited to castproduct
(django42_venv) noisefloor@JSCH-DUT-1647nb:~/code/django42_venv/dut$ python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, wgw
Running migrations:
  Applying wgw.0008_castproduct_edited.../home/noisefloor/code/django42_venv/lib/python3.10/site-packages/django/db/models/fields/__init__.py:1595: RuntimeWarning: DateTimeField CastProduct.edited received a naive datetime (2022-08-01 00:00:00) while time zone support is active.
  warnings.warn(
 OK
Wenn dich die Warnung stört - wobei die hier IMHO egal ist, weil du nur irgendeinen Default Wert braucht, musst du mal lesen, wie man die TimeZone Info noch da rein bekommt.

Gruß, noisefloor
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Prima, vielen Dank. Ich habe es nicht nur hinbekommen, das Feld einzufügen, ich habe es auch geschafft, die wirklichen Werte der letzten Bearbeitung aus dem Protokoll zu übernehmen.
Allerdings habe ich eines noch nicht hinbekommen - die Uhrzeit stimmt nicht. in "settings.py" steht

Code: Alles auswählen

TIME_ZONE = 'Europe/Berlin'
USE_TZ = True
und im view:

Code: Alles auswählen

from django.utils import timezone
trotzdem ist die Uhrzeit zwei Stunden zurück.
Benutzeravatar
grubenfox
User
Beiträge: 433
Registriert: Freitag 2. Dezember 2022, 15:49

dann werden die Funktionen aus dem Modul timezone wohl falsch benutzt
Antworten