Python Django Лучшая практика для request.user в представлениях на основе классов и в Queryset - PullRequest
2 голосов
/ 08 апреля 2020

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

Код

просмотр:

class MyListView(ListView):
    model = MyModel

    def get_queryset(self):
        return self.model.objects.owned_by_user(self.user)

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.user = None

    def dispatch(self, request, *args, **kwargs):
        self.user = request.user

        return super().dispatch(request, *args, **kwargs)

модель:

class MyModelQuerySet(models.QuerySet):
    def owned_by_user(self, user):
        return self.filter(user_field=user)


class MyModelManager(models.Manager):
    def get_queryset(self):
        return MyModelQuerySet(self.model, using=self._db)

    def owned_by_user(self, user):
        return self.get_queryset().owned_by_user(user)


class MyModel(models.Model):
    user_field = ...

    objects = ProductRequestManager()

Лучшая практика 1:

Я думаю, что должен перезаписать отправку, чтобы добавить request.user. Моя IDE отмечает: «Пользователь атрибута экземпляра определен за пределами init . Чтобы предотвратить это, мне также нужно перезаписать init (). Как мне добиться этого с меньшим количеством кода?

Рекомендация 2:

Есть ли другой способ получить наборы запросов, принадлежащие текущему пользователю?

1 Ответ

3 голосов
/ 08 апреля 2020

Вы просто фильтруете набор запросов с помощью self.request.user. Обратите внимание, что метод setup() назначит значения для self.request, self.args и self.kwargs:

class MyListView(ListView):
    model = MyModel

    def get_queryset(self):
        return self.model.objects.owned_by_user(<b>self.request.user</b>)

Примечание : вы можете ограничить просмотры представление на основе классов для аутентифицированных пользователей с помощью LoginRequiredMixin mixin [Django -doc] .

...