Как наложить ограничения на поле Django в экземплярах, связанных с пользователем

Я делаю приложение для практики, функциональность, которую я хочу достичь, заключается в том, что, когда пользователь создает задачу, только поле времени должно быть уникальным для всех его задач, я сделал (unique=True) в поле времени в модели, но это делает его уникальным по всей базе данных, но я хочу, чтобы он был уникальным только для задач, связанных с пользователем. представление выглядит следующим образом:

@login_required(login_url='login')
def home(request):
    tasks = Task.objects.filter(name__username=request.user.username)

    form = TaskForm()
    if request.method == 'POST':
        form = TaskForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.name = request.user
            obj.save()
            return redirect('home')
        else:
            print(request.POST)
            print(request.user.username)
            messages.warning(request, 'Invalid Data!')
            return redirect('home')

    context = {'tasks' : tasks}
    return render(request, 'task/home.html', context)

модель задачи:

class Task(models.Model):
    choices = (
        ('Completed', 'Completed'),
        ('In Complete', 'In Complete'),
    )
    name = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
    task = models.CharField(max_length=200, null=False, blank=False)
    time = models.TimeField(auto_now_add=False, blank=True)
    status = models.CharField(max_length=200, choices=choices, null=True, blank=False)
    
    def __str__(self):
        return self.task
    
    def get_task_author_profile(self):
        return reverse('profile')

Как вы видите, я хочу показать задачу, которую добавил вошедший пользователь.

форма:

class TaskForm(ModelForm):
    class Meta:
        model = Task
        fields = '__all__'
        exclude = ['name']

Функциональность, о которой я говорил выше, я пытался достичь с помощью вида:

@login_required(login_url='login')
def home(request):
    tasks = Task.objects.filter(name__username=request.user.username)
    time = []
    for task in tasks:
        time.append(task['time'])
    form = TaskForm()
    if request.method == 'POST':
        form = TaskForm(request.POST)
        if form.is_valid() and form.cleaned_data['time'] != time:
            obj = form.save(commit=False)
            obj.name = request.user
            obj.save()
            return redirect('home')
        else:
            print(request.POST)
            print(request.user.username)
            messages.warning(request, 'Invalid Data!')
            return redirect('home')

    context = {'tasks' : tasks}
    return render(request, 'task/home.html', context)

но это дало ошибку: TypeError: 'Task' object is not subscriptable
Я знаю, что это неправильно, но как я могу этого добиться, есть ли в Django что-то, что может обеспечить такую функциональность?

Проблема исходит отсюда:

for task in tasks:
    time.append(task['time'])  #<--

Здесь, если вы хотите использовать время доступа, вам нужно использовать task.time, потому что task является объектом.

Также нужно исправить еще одну вещь в вашем существующем коде, чтобы заставить его работать, потому что time является списком:

if form.is_valid() and form.cleaned_data['time'] in time:  
#                                                ^^^

BTW, не нужно усложнять, вы можете добавить ограничение на уровне базы данных из модели, чтобы сделать время уникальным для конкретного пользователя. Также используйте для этого поле DateTime. Вы можете использовать unique_togather для этого:

class Task(models.Model):
    choices = (
        ('Completed', 'Completed'),
        ('In Complete', 'In Complete'),
    )
    name = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
    task = models.CharField(max_length=200, null=False, blank=False)
    time = models.DateTimeField(auto_now_add=False, blank=True)
    status = models.CharField(max_length=200, choices=choices, null=True, blank=False)
    
    class Meta:
        unique_togather = ['name', 'time']
Вернуться на верх