Есть ли лучшее решение для фильтрации объектов модели по разрешению в 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 меня очень беспокоит