如何根据外键关系进行筛选

2024-04-19 01:07:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下型号:

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的团队成员?你知道吗


Tags: namefalsemodelmodelssitelengthmaxteam
3条回答

这可以用一行字来完成,但是让我来解释一下,这样你就可以理解这个概念了:

您可以从请求中获得登录用户,因为您使用了@login\u 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)

试试这个。你知道吗

@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')

相关文档hereherehere。你知道吗

您可以使用^{}来实现这一点。你知道吗

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')

相关问题 更多 >