1

I'm trying to figure out how to add x numbers of days to a field in my Models.py. I read a lot of posts on Stack Overflow (for example this one) and on docs.djangoproject.com.

What I understand is that the best approach is to override the save method. But I can't get it to work. From MeetingSetting I try to get an Integer from the selected day. Then add this number to led_date in MeetingDataLED.

Here is my models.py

from django.db import models
from datetime import datetime, time, timedelta

# Create your models here.
class MeetingSetting(models.Model):

    class Weekdagen(models.IntegerChoices):
        MONDAY = 0
        TUESDAY = 1 
        WEDNESSDAY = 2 
        THURSDAY = 3 
        FRIDAY = 4
        SATERDAY = 5 
        SUNDAY = 6

    meeting_time_led = models.TimeField()
    meeting_time_wt = models.TimeField()
    meeting_day_led = models.IntegerField(choices=Weekdagen.choices)
    meeting_day_wt = models.IntegerField(choices=Weekdagen.choices)

class MeetingDataLED(models.Model):
    led_date = models.DateField(primary_key=True)
    led_meeting_date = models.DateField(blank=True)
    led_start_time = models.TimeField()
    led_type_of_meeting = {
        ('GBS', 'Special one'),
        ('KO', 'Special two'),
        ('NM', 'Special three'),
    }
    led_meeting_type = models.CharField(max_length=3, choices=led_type_of_meeting) 

    def save(self, *args, **kwargs):
        from datetime import datetime, timedelta
        d = timedelta(days=MeetingSetting.meeting_day_led(id=1))
        self.led_meeting_date = self.led_date() + d
        super(MeetingDataLED, self).save(*args, **kwargs)

When I go to the admin page and try to submit some data I get the following error: "'DeferredAttribute' object is not callable"

When I change

d = timedelta(days=MeetingSetting.meeting_day_led(id=1))

to

d = timedelta(days=3)

I get the error: "'datetime.date' object is not callable"

I'm in the dark here in what to do. If someone can point me in the right direction that would be really appreciated.

RoTe
  • 23
  • 6

1 Answers1

0

There are two issues here. The first one is that you can not use .meeting_day_led(…) like that, you fetch the object, and then the attribute. The second is that you should not call self.led_date(), that is an attribute. You thus can rewrite this to:

from datetime import datetime, timedelta

# …

def save(self, *args, **kwargs):
    d = timedelta(days=MeetingSetting.objects.get(id=1).meeting_day_led)
    self.led_meeting_date = self.led_date + d
    super().save(*args, **kwargs)

That being said, hardcoding the primary key is not a good idea: you have no guarantee that there will even be a MeetingSetting with such primary key.

Willem Van Onsem
  • 443,496
  • 30
  • 428
  • 555