如何过滤外键关系

时间:2015-07-31 14:59:57

标签: python django django-models django-forms django-views

我有以下型号:

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

如何对此进行过滤,以便只显示与登录的site具有相同user的团队成员?

3 个答案:

答案 0 :(得分:1)

试试这个。

@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

答案 1 :(得分:1)

您可以使用model relations来实现此目标。

  

要按其他模型中的字段排序,请使用与when相同的语法   你正在查询模型关系。就是这个名字   字段,后跟双下划线(__),后跟名称   新模型中的字段,等等,可以根据需要添加任意数量的模型   加入。

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

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

答案 2 :(得分:1)

这可以单行完成,但让我解释一下,这样你才能理解这个概念:

您可以从请求中登录用户,因为您已经使用了@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)