如何在 Django 中的模型 class 的单个属性中添加整数字段和选项?
How to add both integer field and choices in a single attribute of a model class in django?
我想在我的 assigned_time
字段中添加 days and hours
这两个选项,同时添加多少 days
或多少 hours
。
这是我尝试过的但不起作用的方法。
这是我的model.py
class Timesheet(models.Model):
DAYS= 'D'
HOURS = 'H'
STATUS= [
('D', 'Days'),
('H', 'Hours')
]
employee= models.ForeignKey(Employee, on_delete=models.CASCADE)
date= models.DateField(verbose_name='Date')
designation=models.ForeignKey(Designation, on_delete=models.CASCADE)
projects= models.CharField(max_length=256, verbose_name='Project Name')
assigned_time= models.IntegerField(verbose_name='Assigned Hours/days', choices=STATUS, default=DAYS)
time_spent=models.IntegerField(verbose_name='Spent Hours/Days', choices=STATUS, default=DAYS)
description=models.TextField(max_length=1000, verbose_name='Description')
def __str__(self):
return f'{self.employee.user.first_name} {self.employee.user.last_name} {self.project}'
检查 assigned_time
或 time_spent
字段。正如我上面解释的,我想对两者做同样的事情。
这是我的 admin.py
@admin.register(Timesheet)
class TimesheetAdmin(admin.ModelAdmin):
list_display=('first_name', 'last_name', 'date', 'assigned_time', 'projects', 'time_spent', 'description', 'designation_name')
def first_name(self, obj):
return obj.employee.user.first_name
def last_name(self, obj):
return obj.employee.user.last_name
def designation_name(self, obj):
return obj.designation.designation_name
这是我得到的图像
我应该怎么做才能在一个字段中添加这两项内容?
我认为您应该为时间类型创建另一个字段。您不能在同一领域同时拥有两者。即使由于某些原因它不可读。我建议这样的解决方案:
添加另一个类型字段并在那里使用 CHOICES
:
class Timesheet(models.Model):
STATUS = [
('D', 'Days'),
('H', 'Hours')
]
...
time_type = models.CharField(verbose_name='Type of time', choices=STATUS, default=STATUS[0], max_length=10)
assigned_time = models.IntegerField(verbose_name='Assigned time', default=0)
time_spent = models.IntegerField(verbose_name='Spent time', default=0)
...
我也纠正了你的选择尝试。它不起作用,因为 IntegerField
无法接受 string
值。
更新:
如果你真的需要在一个字段中使用它,你可以使用 IntegerField
这样的选择:
STATUS = [
(1, '1 Hour'),
(2, '2 Hours'),
(3, '3 Hours'),
...
(1, '1 Day'),
(2, '2 Days'),
(3, '3 Days'),
...
]
# or comprehensions will give us same result with less code
STATUS = [
(i, f'{i} Days') for i in range(1, 31)
]
[STATUS.append((i, f'{i} Hours')) for i in range(1, 25)]
但请记住,元组的第一个值必须符合 Field
类型。
我想在我的 assigned_time
字段中添加 days and hours
这两个选项,同时添加多少 days
或多少 hours
。
这是我尝试过的但不起作用的方法。
这是我的model.py
class Timesheet(models.Model):
DAYS= 'D'
HOURS = 'H'
STATUS= [
('D', 'Days'),
('H', 'Hours')
]
employee= models.ForeignKey(Employee, on_delete=models.CASCADE)
date= models.DateField(verbose_name='Date')
designation=models.ForeignKey(Designation, on_delete=models.CASCADE)
projects= models.CharField(max_length=256, verbose_name='Project Name')
assigned_time= models.IntegerField(verbose_name='Assigned Hours/days', choices=STATUS, default=DAYS)
time_spent=models.IntegerField(verbose_name='Spent Hours/Days', choices=STATUS, default=DAYS)
description=models.TextField(max_length=1000, verbose_name='Description')
def __str__(self):
return f'{self.employee.user.first_name} {self.employee.user.last_name} {self.project}'
检查 assigned_time
或 time_spent
字段。正如我上面解释的,我想对两者做同样的事情。
这是我的 admin.py
@admin.register(Timesheet)
class TimesheetAdmin(admin.ModelAdmin):
list_display=('first_name', 'last_name', 'date', 'assigned_time', 'projects', 'time_spent', 'description', 'designation_name')
def first_name(self, obj):
return obj.employee.user.first_name
def last_name(self, obj):
return obj.employee.user.last_name
def designation_name(self, obj):
return obj.designation.designation_name
这是我得到的图像
我应该怎么做才能在一个字段中添加这两项内容?
我认为您应该为时间类型创建另一个字段。您不能在同一领域同时拥有两者。即使由于某些原因它不可读。我建议这样的解决方案:
添加另一个类型字段并在那里使用 CHOICES
:
class Timesheet(models.Model):
STATUS = [
('D', 'Days'),
('H', 'Hours')
]
...
time_type = models.CharField(verbose_name='Type of time', choices=STATUS, default=STATUS[0], max_length=10)
assigned_time = models.IntegerField(verbose_name='Assigned time', default=0)
time_spent = models.IntegerField(verbose_name='Spent time', default=0)
...
我也纠正了你的选择尝试。它不起作用,因为 IntegerField
无法接受 string
值。
更新:
如果你真的需要在一个字段中使用它,你可以使用 IntegerField
这样的选择:
STATUS = [
(1, '1 Hour'),
(2, '2 Hours'),
(3, '3 Hours'),
...
(1, '1 Day'),
(2, '2 Days'),
(3, '3 Days'),
...
]
# or comprehensions will give us same result with less code
STATUS = [
(i, f'{i} Days') for i in range(1, 31)
]
[STATUS.append((i, f'{i} Hours')) for i in range(1, 25)]
但请记住,元组的第一个值必须符合 Field
类型。