简体   繁体   中英

Timezone.now throwing a Type Error when overriding a save method

I am writing an API in Django Rest Framework- when using the POST method to create a new object, if the 'done' field is True and the 'done_date' is Null, I would like the 'done_date' to automatically be set to current time. Here's what I tried to do, overriding the save method in my models:

In models.py


from django.db import models
from django.utils import timezone


class Task(models.Model):
    title = models.CharField(max_length=100)
    done = models.BooleanField(default=False)
    author_ip = models.GenericIPAddressField()
    created_date = models.DateTimeField(default=timezone.now)
    done_date = models.DateTimeField(null=True, blank=True)

    class Meta:
        ordering = ('id',)

    def __str__(self):
        return '{} - {}'.format(self.pk, self.title)

    def save(self, *args, **kwargs):
        if self.done and not self.done_date:
            self.done_date = timezone.now
        super(Task, self).save(*args, **kwargs)

However, this throws a "TypeError when calling Task.objects.create(). This may be because you have a writable field on the serializer class that is not a valid argument to Task.objects.create() . You may need to make the field read-only, or override the TaskSerializer.create() method to handle this correctly." Now, I am fairly certain that it's related to timezone.now in the save method, could someone advise me on how to proceed? I apologise if it is a basic question, thanks!

All you have to do is to call the timezone.now() function (with the parenthesis)
alternatively, you could use: auto_now=True and set editable=True

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM