rock raj
rock raj

Reputation: 5

Django ORM Issue

I am learning RestAPI and When I try to post data to update my database columns the modified_on column should automatically populated to current date and time but it is not updating.

I am currently using django cassandra engine ORM where there is no functionality like auto_add_now() or auto_now().

Can any one give a suggestion where am I going wrong? Model Class:

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())

My Serialization class:

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)

Upvotes: 0

Views: 219

Answers (4)

Tim
Tim

Reputation: 1357

You use default=datetime.datetime.today() as your default value for the fields. Since you call the function immediately (by adding ()), the function is called exactly once on the first load of the code and the datetime at that moment is put into the default value and not updated until you reload the code (a.k.a. restart the server).

If you want to always use the then current time, leave away the () to cause Django to call the function each time. default=datetime.datetime.today

It's preferable for you to use now though, like iklinac did in his answer, as that also respects your timezone settings. His anwer also leaves out the parenteses, yielding the correct result.

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

Upvotes: 0

Verdan Mahmood
Verdan Mahmood

Reputation: 76

Please make sure to add the auto_now=True for your modified_at filed, in your model. It automatically sets the field to now every time the object is saved. Useful for “last-modified” timestamps. Note that the current date is always used; it’s not just a default value that you can override.

Example:

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

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

Upvotes: 0

Ykh
Ykh

Reputation: 7717

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

to

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

change MODIFIED_AT to MODIFIED_ON

You can try:

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 automatically set the field to now when the object is first created. auto_now=True automatically set the field to now every time the object is saved. Doc is here.

Upvotes: 0

iklinac
iklinac

Reputation: 15738

You should rather use utils now for timezone aware times

from django.utils.timezone import now

also in model you should set function not evaluated value ( no parenthesis after now )

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

Upvotes: 1

Related Questions