Есть ли лучшее решение для фильтрации объектов модели по разрешению в django

У меня есть Django модель Task, содержащая разрешения.

from django.db import models
from django.contrib.auth.models import Permission

# Other stuff

class TaskType(models.Model):
    required_permissions = models.ManyToManyField(Permission)
    # Other non relevant fields

class Task(models.Model):
    begin = models.DateTimeField( #Options left out
    end = models.DateTimeField( #Options left out
    type = models.ForeignKey(TaskType, on_delete=models.CASCADE)
    # Other non relevant fields

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

Мое текущее решение этой проблемы заключается в том, чтобы запросить объекты из базы данных, которые могут быть допустимыми кандидатами, и отфильтровать те, на которые у пользователя нет прав в python. Это, очевидно, кажется немного глупым, поскольку это должно быть сделано запросом к базе данных (поскольку системы управления базами данных довольно сложны для таких задач). Мое текущее решение выглядит следующим образом:

def is_task_valid(self, task):
    for p in task.type.permissions.all():
        if not user.has_perm(p.content_type.app_label + "." + p.codename):
            return False:
    # Also checks for all assigned tasks of user in that time slot and returns False
    # if they overlap
    return True

def get_context_data(self):
    # obtains other data
    for t in self.get_task_query_set()
        if self.is_task_valid(t):
            context["tasks"].append(t)
    # ...
    return context

Есть ли лучшее решение этой проблемы? Фильтрация разрешений с помощью Django QuerySet API меня очень беспокоит

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