为请求的用户查询 ManyToManyfield

query ManyToManyfield for requested user

我有两个模型,一个用户模型和一个运动模型。这两个模型具有 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()

如果要查找用户参加的运动,则必须过滤特定于用户行的运动模型查询集。

Sports.objects.filter(user__id = request.user.id)

由于 Sports 和 User 具有多对多关系,您可以在 Sports 模型相关查询中访问“User”模型属性。 “id”是 auto-generated 键,如果您使用任何主键,您可以用它替换“id”。

这里通常有两个选项:

Sport.objects.filter(user=request.user)

或:

request.user.sports.all()

两者将进行相同的数据库查询。您应该使用 @login_required decorator [Django-doc] 来阻止 non-authenticated 用户访问视图,因为那时 request.user 不是用户对象。此外,视图可以 而不是 return 字典:它应该 return 一个 HttpResponse 对象,例如通过呈现模板:

from django.contrib.auth.decorators import <strong>login_required</strong>

<strong>@login_required</strong>
def test(request):
    context = {
        'sports': request.user.sports.all()
    }
    # …