Django пользовательских ModelManager для неявного ограничения запросов, доступных для пользователя - PullRequest
0 голосов
/ 19 февраля 2020

В моем случае я хочу, чтобы разные пользователи могли работать над своими собственными проектами, и им было запрещено видеть материалы в других проектах, даже на сайте администратора. Существует ряд моделей, которые должны быть отфильтрованы обратно до «проекта» - например, конкретный Ответ расширяет класс «Абстрактный», в котором есть вопрос в качестве внешнего ключа, и Вопрос, в котором проект является внешним ключом.

Мой план состоял в том, чтобы изменить ModelManager по умолчанию get_queryset () и вернуть набор запросов с фильтром, например: Project.objects.filter (group__in = user.groups.all ())

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

Промежуточное ПО, поддерживающее набор запросов, проиндексированных потоком, обрабатывающим их

Но оно с 2010 года, и я не уверен сколько Django, Python, обработка потоков, ландшафт безопасности и т. д. c могли измениться за это время. Есть ли сейчас предпочтительный способ сделать это, возможно, с помощью сеансов?

(связанная с этим проблема здесь: Django пользовательский объект запроса менеджера / текущий пользователь )

1 Ответ

0 голосов
/ 21 февраля 2020

В переводе на современный день Django промежуточное программное обеспечение:

from threading import current_thread

_requests = {}

def get_request():
    return _requests[current_thread()]

class GlobalRequestMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        _requests[current_thread()] = request
        return self.get_response(request)

Мне нужно импортировать get_request (), чтобы получить доступ к диктату _requests.

...