如何过滤外键关系

How to filter on a foreign key relationship

我有以下型号:

class UserProfile(models.Model):
    user = models.OneToOneField(User)

class Site(models.Model):
    user = models.ForeignKey(User)
    site_name = models.CharField(max_length=128, blank=False, null=False)

class Team(models.Model):
    site = models.ForeignKey(Site)
    team_member_name = models.CharField(default='name', max_length=128, blank=False, null=False)

我有一个列出数据库中所有 team 成员的视图:

@login_required
def home(request, team_member_id=None):
    team_members = Team.objects.all().order_by('team_member_name')

我如何过滤它以便只显示与登录的 user 具有相同 site 的团队成员?

试试这个。

@login_required
def home(request, team_member_id=None):
    user = request.user
    team_members = Team.objects.all().filter(site__user=user).order_by('team_member_name')

相关文档here, here, and here.

您可以使用 model relations 来实现。

To order by a field in a different model, use the same syntax as when you are querying across model relations. That is, the name of the field, followed by a double underscore (__), followed by the name of the field in the new model, and so on for as many models as you want to join.

对于您的情况,以下应该有效:

team_members = Team.objects.filter(site__user=user).order_by('team_member_name')

这可以在一行中完成,但让我解释一下,以便您理解这个概念:

您可以从请求中获取登录用户,因为您使用了@login_required(访问视图的用户将始终处于登录状态)

loggedin_user = request.user

获取用户的站点:

site_of_logged_in_user = Site.objects.get(user=loggedin_user)
# if there can be only one site for a user

现在您可以通过按站点过滤来获取团队

team = Team.objects.filter(site=site_of_logged_in_user)