Фильтровать список объектов по self.request.user в Django

Я не могу заставить это работать:

class MyView(generic.ListView):
    context_object_name = 'my-model-list'
    template_name = 'my_models.html'

    def get_queryset(self):
        return MyModel.objects.filter(user=self.request.user)

Я также пытался

return MyModel.objects.filter(user=User.objects.filter(name=self.request.user))

Похоже, что self.request.user возвращает имя. Я получаю ошибку

Cannot query "a": Must be "User" instance.

Имя пользователя "а".

Моя модель

from .models import User

class MyModel(models.Model):
    user = models.ForeignKey(User)

Может кто-нибудь мне помочь?

Заранее спасибо.

3 ответа

Решение

Ваш код, как показано, является правильным. Проблема в том, что вы определяете свой собственный класс User, а Django не знает, как с ним обращаться при выполнении запросов.

Самый простой способ сделать это - использовать пользователя Django. Если вы настаиваете на использовании своего собственного пользовательского класса, вам нужно будет изменить этот класс для правильного наследования от пользователя Django и некоторых других вещей (на этом есть несколько Stackru).

В вашем./MyModel/models.py вы хотите импортировать пользователя как таковой:

from django.contrib.auth.models import User

Оставьте ваши другие модели и ваши представления как есть (если они также не импортируют пользователя).

Вам также может потребоваться обновить файл настроек, чтобы он выглядел примерно так (это может быть не совсем правильно):

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    )

Не забудьте перенести вашу БД после внесения этих изменений.

Вы наследуете пользовательскую модель неверным способом. использование from django.contrib.auth.models import User вместо.

Вы можете использовать self.request.user.mymodel_set.all(), чтобы получить все запросы текущего пользователя.

from .models import User

class MyModel(models.Model):
    user = models.ForeignKey(User)


class MyView(generic.ListView):
    context_object_name = 'my-model-list'
    template_name = 'my_models.html'

    def get_queryset(self):
        return self.request.user.mymodel_set.all()
Другие вопросы по тегам