Как добавить целочисленное поле и выбор в один атрибут класса модели в django?

Я хочу добавить оба варианта days and hours в поле assigned_time, а также добавить сколько 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

Вот изображение того, что я получаю

enter image description here

Что нужно сделать, чтобы добавить обе вещи в одно поле?

Я думаю, вам следует создать другое поле для типа времени. Вы не можете иметь оба в одном поле. Даже если это будет не читаемо по некоторым причинам. Я предлагаю такое решение:

Добавьте еще одно поле типа и используйте 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.

UPDATE: Если вам действительно нужно иметь это в одном поле, вы можете использовать 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 типу.

Вернуться на верх