Python @Django中models.py内有两个函数的属性
我的模型由以下内容组成:Python @Django中models.py内有两个函数的属性,python,django,django-models,Python,Django,Django Models,我的模型由以下内容组成: class Employee(models.Model): #time work monday_st = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='8') monday_end = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='20') tuesday_st = m
class Employee(models.Model):
#time work
monday_st = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='8')
monday_end = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='20')
tuesday_st = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='8')
tuesday_end = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='20')
wednesday_st = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='8')
wednesday_end = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='20')
thursday_st = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='8')
thursday_end = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='20')
friday_st = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='8')
friday_end = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='20')
saturday_st = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='0')
saturday_end = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='0')
sunday_st = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='0')
sunday_end = models.CharField(max_length=2, choices=CHOICES_DAY_WORK, default='0')
我想筛选目前正在工作的员工。所以这是他们工作的反映,在一个类似这样的模型中
@property
def is_expired(self):
actual_hour = int(datetime.datetime.now().strftime('%H'))
if actual_hour in list(range(int(self.monday_st), int(self.monday_end))):
return True
return False
def day_st():
actual_day_number = datetime.datetime.today().weekday() + 1
if actual_day_number == 1:
return monday_st
if actual_day_number == 2:
return tuesday_st
if actual_day_number == 3:
return wednesday_st
if actual_day_number == 4:
return thursday_st
if actual_day_number == 5:
return friday_st
if actual_day_number == 6:
return saturday_st
if actual_day_number == 7:
return sunday_st
def day_end():
actual_day_number = datetime.datetime.today().weekday() + 1
if actual_day_number == 1:
return monday_end
if actual_day_number == 2:
return tuesday_end
if actual_day_number == 3:
return wednesday_end
if actual_day_number == 4:
return thursday_end
if actual_day_number == 5:
return friday_st
if actual_day_number == 6:
return saturday_end
if actual_day_number == 7:
return sunday_end
如果员工当前正在工作,则在my views.py中返回“True”
if instance.is_expired == True:
'the employee is working'
else:
'no working'
但是如果员工只在给定的一天工作,那么它需要信息,所以我创建了一个包含辅助函数的文件,如下所示
@property
def is_expired(self):
actual_hour = int(datetime.datetime.now().strftime('%H'))
if actual_hour in list(range(int(self.monday_st), int(self.monday_end))):
return True
return False
def day_st():
actual_day_number = datetime.datetime.today().weekday() + 1
if actual_day_number == 1:
return monday_st
if actual_day_number == 2:
return tuesday_st
if actual_day_number == 3:
return wednesday_st
if actual_day_number == 4:
return thursday_st
if actual_day_number == 5:
return friday_st
if actual_day_number == 6:
return saturday_st
if actual_day_number == 7:
return sunday_st
def day_end():
actual_day_number = datetime.datetime.today().weekday() + 1
if actual_day_number == 1:
return monday_end
if actual_day_number == 2:
return tuesday_end
if actual_day_number == 3:
return wednesday_end
if actual_day_number == 4:
return thursday_end
if actual_day_number == 5:
return friday_st
if actual_day_number == 6:
return saturday_end
if actual_day_number == 7:
return sunday_end
但我不能在我的模型中使用它。我正在尝试类似的东西
from .my_helped_function import day_st, day_end
@property
def is_expired(self):
actual_hour = int(datetime.datetime.now().strftime('%H'))
if actual_hour in list(range(int(self.day_st), int(self.day_end))):
return True
return False
这上面我写的东西不起作用。如何从@property获取“真实”值?仅在当天最快的速度
在我看来,我的方法相当复杂,因此我对如何更快地完成这项工作持开放态度。既然您是从模型类外部导入这些辅助函数,请尝试这样做:
# . . .
def is_expired(self):
# . . .
if actual_hour in list(range(int(day_st()), int(day_end()))):
# . . .
通过稍微简化代码,这可能会更容易处理,也会提高效率 例如,我们可以将支票写为:
Employee(models.Model):
# ...
@property
def is_expired(self):
hour = datetime.datetime.now().hour
return hour in range(int(self.day_st), int(self.day_end))
因此,通过在Employee
模型中声明三个@property
s,我们就完成了
注意:由于您似乎在员工的模型中为周一
、周一
等使用整数,因此您应该使用。通过使用IntegerField
,您的数据库可以帮助保护模型的类型完整性,而且您不必自己进行大量手动强制转换
尝试执行此操作时,他收到这样一个错误:“Employee”对象没有属性“day\st”。我的使用如果列表中的实际小时数(范围(int(self.day\u st()),int(self.day\u end())):
尝试删除self。
返回:名称“friday\u st”未定义(一周中的当前日期)只是一个旁注。如果我是你,我希望有一个包含四列的表:employee、day/date、start time和end time。这对我来说更有意义,更容易查询、分析等。我能请你在完整答案中展示一个例子吗。提前谢谢。但是如果我想让用户看到这个字段,该怎么办呢。示例时间9点。在my choices.py'('9','9.00')中,在这种情况下也可以使用integerfield吗?怎样?使用''9',9.00',或在表格中覆盖它?@MaddieGraham:是的,请参见示例。作为选项,您可以使用choices=[(0,'0:00'),(1,'1:00')]
,第一个元素是“键”(您在模型中输入的值),第二个元素是“值”(文本表示)。