Запрос 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()
    }
    # …
Вернуться на верх