Запрос ManyToManyfield для запрашиваемого пользователя
У меня есть две модели, модель пользователя и модель спорта. Эти две модели имеют m2m отношения, так как пользователь может заниматься несколькими видами спорта, а одним видом спорта может заниматься более одного пользователя. Я хочу получить набор запросов по видам спорта пользователя, так что только те виды спорта, которыми занимается конкретный пользователь, отображаются для этого пользователя.
Я создал файл context_processors.py, чтобы информация была доступна на всех страницах сайта. Проблема в том, что я не знаю, как запросить базу данных, чтобы получить эту информацию.
Вот мои модели:
class Sport(models.Model):
name = models.CharField(max_length=100, null=False)
class User(AbstractUser):
...
sports = models.ManyToManyField(Sport)
Прямо сейчас я получаю все доступные виды спорта, вот так
def test(request):
sports = Sport.objects.all()
return {
'x': sports
}
Я просто хочу получить виды спорта, к которым приписан запрашиваемый пользователь, в переменной sports.
sports = request.user.sports.all()
Если вы ищете виды спорта, которыми занимался пользователь, вы должны отфильтровать кверисет спортивной модели, специфичный для строки User.
Sports.objects.filter(user__id = request.user.id)
Поскольку между Sports и User существует множество отношений, вы можете обращаться к атрибуту модели "User" в запросах, связанных с моделью Sports. "id" - это автоматически генерируемый ключ, если вы используете любой первичный ключ, вы можете заменить "id" на него.
Обычно здесь есть два варианта:
Sport.objects.filter(user=request.user)
или:
request.user.sports.all()
оба будут делать один и тот же запрос к базе данных. Вы должны использовать декоратор @login_required [Django-doc] для предотвращения посещения представления неаутентифицированными пользователями, поскольку в этом случае request.user не является объектом пользователя. Кроме того, представление может не возвращать словарь: оно должно возвращать HttpResponse объект, например, путем рендеринга шаблона:
from django.contrib.auth.decorators import login_required
@login_required
def test(request):
context = {
'sports': request.user.sports.all()
}
# …