Фильтровать список объектов по 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()