Django DateTimeField () из-за TypeError (объект datetime.timedelta не вызывается) - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь получить разницу двух Дейтифилд в Джаго.Я попытался переопределить функцию сохранения по умолчанию (), но все еще получаю ошибку.

models.py

class Sample(models.Model):
    ad_start = models.DateTimeField() 
    ad_end = models.DateTimeField()
    ad_duration = models.IntegerField()

@property
def get_time_diff(self):
    timediff = self.ad_end - self.ad_start
    return timediff
    #return relativedelta(self.ad_end, self.ad_start)

def save(self, *args, **kwargs):
    self.ad_duration = self.get_time_diff()
    super(Sample, self).save(*args, **kwargs)

forms.py

class SampleForm(forms.ModelForm):
class Meta:
    model = Sample
    exclude = ("submitted", 'ad_duration', "list_date" )
    widgets = {
        'ad_start': DatePickerInput(), 
        'ad_end': DatePickerInput(),
    }

Ошибка

Django Version: 2.1.7
Exception Type: TypeError
Exception Value:'datetime.timedelta' object is not callable

1 Ответ

0 голосов
/ 05 марта 2019

В вашем коде необходимо внести два изменения.

Во-первых, вам необходимо удалить @property из метода get_time_diff.Потому что вы не можете вызвать метод свойства через ().Или вы все еще можете сохранить метод свойства, но не вызывать его в функции сохранения, например, так: self.ad_duration = self.get_time_diff

Во-вторых, вам нужно обновить поле модели до DurationField для хранения объекта дельты времени, созданного в get_time_diff.Например:

class Sample(models.Model):
        ad_start = models.DateTimeField() 
        ad_end = models.DateTimeField()
        ad_duration = models.DurationField()


    def get_time_diff(self):
        timediff = self.ad_end - self.ad_start
        return timediff


    def save(self, *args, **kwargs):
        self.ad_duration = self.get_time_diff()
        super(Sample, self).save(*args, **kwargs)

Или вы можете получить общее количество секунд из get_time_diff и сохранить его в поле ad_duration (которое будет полем с плавающей запятой).

class Sample(models.Model):
    ad_start = models.DateTimeField() 
    ad_end = models.DateTimeField()
    ad_duration = models.FloatField()

    def get_time_diff(self):
        timediff = self.ad_end - self.ad_start
        return timediff.total_seconds()  # returns value in seconds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...