2017-11-22 1 views
0

Ich lerne RestAPI und wenn ich versuche, Daten zu aktualisieren, um meine Datenbankspalten zu aktualisieren, sollte die Spalte "moded_on" automatisch das aktuelle Datum und die aktuelle Uhrzeit anzeigen, aber es wird nicht aktualisiert.Django ORM Problem

Ich verwende derzeit django cassandra engine ORM, wo es keine Funktionalität wie auto_add_now() oder auto_now() gibt.

Kann jemand einen Vorschlag geben, wo ich falsch liege? Model-Klasse:

class Mydb(DjangoCassandraModel): 
    id = columns.UUID(primary_key=True, default=uuid.uuid4()) 
    user_name = columns.Text() 
    user_email = columns.Text(default=None) 
    user_password = columns.Text() 
    description = columns.Text() 
    creation_date = columns.DateTime(default=datetime.datetime.today(), static=True) 
    modified_on = columns.DateTime(default=datetime.datetime.today()) 

Meine Serialisierung Klasse:

class TaskSerializer(serializers.Serializer): 
    # id = serializers.UUIDField(default=uuid.uuid4) 
    USER_ID = serializers.UUIDField(default= uuid.uuid4(),source='id') 
    # user_name = serializers.CharField(max_length=50) 
    USER_NAME_FIELD = serializers.CharField(max_length=50, source='user_name') 
    USER_EMAIL = serializers.CharField(source='user_email') 
    USER_PASSWORD = serializers.CharField(max_length=20, source='user_password') 
    EXPLANATION = serializers.CharField(max_length=100, source='description') 
    MODIFIED_AT = serializers.DateTimeField(default=datetime.datetime.today(), source='modified_on') 
    CREATED_ON = serializers.DateTimeField(default=datetime.datetime.today(), source='creation_date') 

    def create(self, validated_data): 
     return Mydb.objects.create(**validated_data) 

    def update(self, instance, validated_data): 
     # instance.id = validated_data.get('id', instance.id) 
     instance.user_name = validated_data.get('user_name', instance.user_name) 
     instance.user_email = validated_data.get('user_email', instance.user_email) 
     instance.user_password = validated_data.get('user_password', instance.user_password) 
     instance.description = validated_data.get('description',instance.description) 
     instance.modified_on = validated_data.get('modified_on', instance.modified_on) 
     instance.save() 
     # instance.creation_date = validated_data.get('creation_date', instance.creation_date) 

Antwort

1

Sie sollten utils lieber jetzt verwenden, um Zeitzone bewusst Zeiten

from django.utils.timezone import now 

auch in Modell sollten Sie Funktion nicht ausgewertet Wert (keine Klammern nach dem jetzt) ​​

MODIFIED_AT = serializers.DateTimeField(default=now, source='modified_on') 
+0

Vielen Dank. –

0
MODIFIED_AT = serializers.DateTimeField(default=datetime.datetime.today(), source='modified_on') 

zu

MODIFIED_ON = serializers.DateField(default=datetime.datetime.today(), source='modified_on') 

Änderung MODIFIED_AT zu MODIFIED_ON

können Sie versuchen:

create_date = models.DateField(auto_now_add=True, 
           verbose_name=u'Create date') 
update_date = models.DateTime(auto_now=True, 
           verbose_name=u'Update date') 

auto_now_add automatisch das Feld nun eingestellt, wenn das Objekt erstellt wird. auto_now=True automatisch das Feld auf jetzt jedes Mal das Objekt gespeichert wird. Doc ist here.

0

Bitte stellen Sie sicher, fügen Sie die Set auto_now=True für Ihre modified_at eingereicht, in Ihrem Modell. Es setzt automatisch das Feld auf jetzt jedes Mal, wenn das Objekt gespeichert wird. Nützlich für "zuletzt geänderte" Zeitstempel. Beachten Sie, dass das aktuelle Datum immer verwendet wird. Es ist nicht nur ein Standardwert, den Sie überschreiben können.

Beispiel:

class Mydb(DjangoCassandraModel): 
    creation_date = columns.DateTime(auto_now_add=True) 
    modified_on = columns.DateTime(auto_now=True) 

Docs hier: https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.DateField.auto_now

0

Sie verwenden default=datetime.datetime.today() als Standardwert für die Felder. Da Sie die Funktion sofort aufrufen (durch Hinzufügen von ()), wird die Funktion beim ersten Laden des Codes genau einmal aufgerufen, und die Datetime in diesem Moment wird in den Standardwert übernommen und erst aktualisiert, wenn Sie den Code erneut laden (auch Server neu starten)).

Wenn Sie immer die aktuelle Uhrzeit verwenden möchten, lassen Sie () weg, damit Django die Funktion jedes Mal aufruft. default=datetime.datetime.today

Es ist vorzuziehen, dass Sie now verwenden, wie es iklinac in seiner Antwort getan hat, da dies auch Ihre Zeitzoneneinstellungen berücksichtigt.Seine Antwort lässt auch die Parentesen aus und liefert das richtige Ergebnis.

from django.utils.timezone import now 
... 
    MODIFIED_AT = serializers.DateTimeField(default=now, source='modified_on')