如何过滤外键关系
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')
您可以使用 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)
我有以下型号:
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')
您可以使用 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)