2015-07-21 40 views
0

這已經發生在我身上多次,它無法識別我爲某個對象所做的字段。 下面是跟蹤:Django:AttributeError:'Employee'對象沒有屬性'current_hours'

Traceback (most recent call last): 
File "<console>", line 1, in <module> 
File "C:\Users\ResNet\Desktop\Scheduler\Scheduler\Scheduler_App\models.py", line 106, in init 
    kevin.get_current_hours(w) 
File "C:\Users\ResNet\Desktop\Scheduler\Scheduler\Scheduler_App\models.py", line 240, in get_current_hours 
    self.curent_hours.save() 
AttributeError: 'Employee' object has no attribute 'curent_hours' 

這裏是最models.py的:

class Week(models.Model): 
    """ Base class for the workweek. """ 
    dt = models.DateTimeField(default=timezone.now) 
    days = models.ManyToManyField('Day') 

    @classmethod 
    def create(cls, dt): 
     week = cls(dt=dt) 
     return week 

    def add_staff(self, days_availability, num_qhs, employee): # untested 
     for q in range(num_qhs): 
      qh = dt2qh(self, days_availability[q].dt) 
      qh.staff.add(employee) 
      qh.staff.save() 
      # self.save() -- unsure 


class Day(models.Model): 
    """ Base class for the day. """ 
    dt = models.DateTimeField(default=timezone.now) 
    total_available_qhs = models.DecimalField(default=0, max_digits=4, decimal_places=2, blank=True) 
    total_available_qhs.null = True 
    hours = models.ManyToManyField('Hour') 

    @classmethod 
    def create(cls, dt): 
     day = cls(dt=dt) 
     return day 

    def get_total_available_qhs(self, employees): # untested 
     self.total_available_qhs = employees.total_available_qhs_per_day(self.dt) 
     return self.total_available_qhs 


class Hour(models.Model): 
    """ Base class for the hour. """ 
    dt = models.DateTimeField(default=timezone.now) 
    qhs = models.ManyToManyField('QuarterHour') 

    @classmethod 
    def create(cls, dt): 
     hour = cls(dt=dt) 
     return hour 


class QuarterHour(models.Model): 
    """ Base class for the quarter hour. """ 
    dt = models.DateTimeField(default=timezone.now) 
    staff = models.ManyToManyField('Employee', related_name='Employee') 

    @classmethod 
    def create(cls, dt): 
     qh = cls(dt=dt) 
     return qh 


def init(): # Creates the week structure 
    w = Week.create(datetime.datetime(2015, 7, 13)) 
    w.save() 
    # print(w.days.get(dt=datetime.datetime(2015, 7, 13)).dt) 
    for i in range(5): # Mon - Fri 
     d = Day.create(w.dt + datetime.timedelta(days=i)) 
     d.save() 
     for j in range(11): # 8am - 7pm 
      h = Hour.create(d.dt + datetime.timedelta(hours=j + 8)) 
      h.save() 
      for k in range(4): # 0m, 15m, 30m, 45m 
       qh = QuarterHour.create(h.dt + datetime.timedelta(minutes=15 * k)) 
       qh.save() 
       h.qhs.add(qh) 
      h.save() 
      d.hours.add(h) 
     d.save() 
     w.days.add(d) 
    w.save() 

    # Week structure test 
    '''for d in w.days.all(): 
     for h in d.hours.all(): 
      for qh in h.qhs.all(): 
       print(qh.dt)''' 

    # dt2qh test 
    '''dttm = datetime.datetime(2015, 7, 14, 18, 45) 
    print(dttm, 'should =', dt2qh(w, dttm).dt)''' 


    # Employee class testing 
    kevin = Employee.create('kevin', 10, 2) 
    kevin.save() 
    for d in range(5): 
     for h in range(11): 
      for q in range(4): 
       if d > 1: 
        qh = w.days.all()[d].hours.all()[h].qhs.all()[q] 
        qh.staff.add(kevin) 
        qh.staff.get(name='kevin').save() 
        #qh.save() 
    kevin.get_current_hours(w) 
    for e in kevin.current_hours.all(): 
     print(e.dt) 
     print(kevin.name) 
    for d in range(5): 
     for h in range(11): 
      for q in range(4): 
       print(w.days.all()[d].hours.all()[h].qhs.all()[q].dt) 
       print(w.days.all()[d].hours.all()[h].qhs.all()[q].staff.all()[0].name) 


def dt2qh(week, dt): # converts from datetime to quarter hour 
    d = (dt - week.dt).days 
    h = dt.hour - 8 
    q = int(math.floor(dt.minute/15)) 
    # print(d, h, q) 
    return week.days.all()[d].hours.all()[h].qhs.all()[q] 


class Employee(models.Model): 
    """ Base class for a employee.""" 
    name = models.CharField(max_length=100) 
    requested_hours = models.DecimalField(default=0, max_digits=4, decimal_places=2) 
    requested_days = models.DecimalField(default=0, max_digits=4, decimal_places=2) 
    availability = models.ManyToManyField('QuarterHour', related_name='availability') 
    current_hours = models.ManyToManyField('QuarterHour', related_name='current_hours') 
    # add a+, project work, front desk booleans 

    def __str__(self): 
     return self.name 

    @classmethod 
    def create(cls, nm, rh, rd): 
     employee = cls(name=nm, requested_hours=rh, requested_days=rd) 
     return employee 

    def get_current_hours(self, week): # untested 
     for d in range(5): 
      for h in range(11): 
       for q in range(4): 
        qh = week.days.all()[d].hours.all()[h].qhs.all()[q] 
        for s in range(len(qh.staff.all())): 
         if qh.staff.all()[s].name == self.name and qh not in enumerate(self.current_hours.all()): 
          self.current_hours.add(qh) 
          self.curent_hours.save() 
          break 

    def get_num_current_hours(self): # untested 
     return len(self.current_hours.all()) 

    def hours_fulfilled(self): # untested 
     return self.get_num_current_hours() >= self.requested_hours * 4 

    # untested 
    def add_availability(self, start, end, week): # start/end datetimes can  only be from same day 
     temp = start 
     while temp < end: 
      self.availability.add(dt2qh(week, temp)) 
      self.availability.save() 
      temp += datetime.timedelta(minutes=15) 

    def availability_for_day(self, dt): # untested 
     temp = [] 
     for qh in self.availability.all(): 
      if qh.dt.day == dt.day: 
       temp.append(qh) 
     return temp 

    # tries to even out peoples hours 
    def suggested_qhs_per_day(self): # untested 
     return math.floor(self.requested_hours * 4/self.requested_days) 


class Employees(models.Model): 
    """ Class for list of employees """ 
    list = models.ManyToManyField('Employee') 

    @classmethod 
    def create(cls, list): 
     employees = cls(list=list) 
     return employees 

    def total_available_qhs_per_day(self, day): # day is a datetime 
     temp = 0 
     for e in self.list.all(): 
      temp += len(e.availability_for_day(day)) 
     return temp 

    def available_employees(self, day): # day is a datetime 
     temp = [] 
     for e in self.list.all(): 
      if len(e.availability_for_day(day)) > 0: 
       temp.append(e) 
     return temp 

這裏是唯一的遷移:

class Migration(migrations.Migration): 

dependencies = [ 
] 

operations = [ 
    migrations.CreateModel(
     name='Day', 
     fields=[ 
      ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), 
      ('dt', models.DateTimeField(default=django.utils.timezone.now)), 
      ('total_available_qhs', models.DecimalField(default=0, blank=True, max_digits=4, decimal_places=2, null=True)), 
     ], 
    ), 
    migrations.CreateModel(
     name='Employee', 
     fields=[ 
      ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), 
      ('name', models.CharField(max_length=100)), 
      ('requested_hours', models.DecimalField(default=0, max_digits=4, decimal_places=2)), 
      ('requested_days', models.DecimalField(default=0, max_digits=4, decimal_places=2)), 
     ], 
    ), 
    migrations.CreateModel(
     name='Employees', 
     fields=[ 
      ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), 
      ('list', models.ManyToManyField(to='Scheduler_App.Employee')), 
     ], 
    ), 
    migrations.CreateModel(
     name='Hour', 
     fields=[ 
      ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), 
      ('dt', models.DateTimeField(default=django.utils.timezone.now)), 
     ], 
    ), 
    migrations.CreateModel(
     name='QuarterHour', 
     fields=[ 
      ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), 
      ('dt', models.DateTimeField(default=django.utils.timezone.now)), 
      ('staff', models.ManyToManyField(to='Scheduler_App.Employee', related_name='Employee')), 
     ], 
    ), 
    migrations.CreateModel(
     name='Week', 
     fields=[ 
      ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), 
      ('dt', models.DateTimeField(default=django.utils.timezone.now)), 
      ('days', models.ManyToManyField(to='Scheduler_App.Day')), 
     ], 
    ), 
    migrations.AddField(
     model_name='hour', 
     name='qhs', 
     field=models.ManyToManyField(to='Scheduler_App.QuarterHour'), 
    ), 
    migrations.AddField(
     model_name='employee', 
     name='availability', 
     field=models.ManyToManyField(to='Scheduler_App.QuarterHour', related_name='availability'), 
    ), 
    migrations.AddField(
     model_name='employee', 
     name='current_hours', 
     field=models.ManyToManyField(to='Scheduler_App.QuarterHour', related_name='current_hours'), 
    ), 
    migrations.AddField(
     model_name='day', 
     name='hours', 
     field=models.ManyToManyField(to='Scheduler_App.Hour'), 
    ), 
] 

我是新來的Django,這已經完全制止了我。我剛剛從sqlite3切換到MySQL,因爲我認爲這是問題的原因,但是,唉,沒用。我早些時候通過解決這個錯誤,並且在第二次遷移中生成了一個AlterField,但是這次還沒有成功。我也嘗試過以幾種方式手動修改遷移無濟於事。任何幫助將不勝感激,謝謝。

回答

2

您的回溯表明您在current_hours中缺少r

它不應該是

self.curent_hours.save() # missing an `r` in 'current' 

反而是

self.current_hours.save() 

發現在你的代碼中缺少current_hoursr

0

你犯了一個錯字。將self.curent_hours.save()更改爲self.current_hours.save()