Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python @Django中models.py内有两个函数的属性_Python_Django_Django Models - Fatal编程技术网

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')]
,第一个元素是“键”(您在模型中输入的值),第二个元素是“值”(文本表示)。