Самый безопасный и самый сухой способ фильтрации query_set в зависимости от некоторой пользовательской информации - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть модель Post с логическим полем is_draft. Если пользователь вошел в систему и является сотрудником, то я хочу отобразить все сообщения; в противном случае, только сообщения, для которых is_draft является ложным.

Моей первой мыслью было использование диспетчера пользовательских моделей и использование request.user следующим образом:

class PostManager(models.Manager):
def get_queryset(self):
    if request.user and request.user.is_staff:
        return super().get_queryset()
    else:
        return super().get_queryset().filter(is_draft=False)

, но запрос недоступен в модель.

Я видел, как некоторые люди используют промежуточное ПО для доступа к пользователю в модели. Мне кажется, это самый безопасный способ удовлетворить мою потребность (ie это делается один раз, в пользовательском менеджере; люди, изменяющие views.py, не должны беспокоиться, не рискуя забывать об этом), но это решение кажется спорным.

У меня, конечно, есть возможность добавить некоторые логи c в представление, но я чувствую, что это не DRY (как я много раз запрашиваю в Post), ни безопасно (риск, что кто-то забудет об этом в какой-то момент) .

По вашему мнению, какой самый чистый и безопасный способ удовлетворить эту потребность?

PS: Я нашел аналогичный вопрос , для которого было найдено решение. предлагается для представлений на основе классов, но мои представления основаны на функциях.

Большое спасибо!

1 Ответ

1 голос
/ 21 апреля 2020

Вы можете фильтровать с помощью пользовательской функции в менеджере.

class PostManager(models.Manager):

     def get_posts(self, user):
          if user.is_staff:
               return super().get_queryset()
          else:
               return super().get_queryset().filter(is_draft=False)

И в вашем представлении получить набор запросов, используя:

qs = Post.objects.get_posts(request.user)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...