У меня есть конкретная модель, и у этой модели есть точные настройки доступа.Примерно так:
class Document(models.Model):
...
access = models.ManyToManyField(Group)
Группы состоят из определенных тегов, и эти теги связаны с пользователями.Короче говоря, так или иначе документы доступны только определенным пользователям.Очень важно, чтобы эта проверка не проскальзывала сквозь трещины.Так что я вижу несколько вариантов.Во-первых, каждый раз, когда я получаю доступ к Документу, я добавляю проверку:
Document.objects.filter (access__group__tag__user = request.user)
Но есть два недостатка: а) Я запрашиваю модель документов> 100 раз в своих представлениях, чтобы у меня было МНОГО повторного кода, и б) вполне вероятно, что кто-то в какой-то момент забудет добавить это ограничение, оставив документы открытыми.
Так что я думаю, что перезапись объектов () наиболее целесообразна с помощью специального менеджера.Таким образом, я не дублирую код и не рискну забыть сделать это.
class HasAccessManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(access__group__tag__user=request.user)
class Document(models.Model):
...
access = models.ManyToManyField(Group)
objects = HasAccessManager()
Однако проблема заключается в том, что запрос там недоступен:
имя «запрос» не определено
Как решить эту проблему?Или есть лучшие решения?