如何过滤查询集

时间:2019-08-22 18:20:38

标签: django

我想过滤通过过滤一次获得的查询集,但我不知道如何。

当前,我们正在从下面获取数据。 我想根据情况从表中单独获取数据 。 我就是不知道。

#view
context_data = super(members,self).get_context_data(**kwargs)
group = belong.objects.get(user=self.request.user).group
belong_queryset = belong.objects.filter(group=group)
#I want to apply belong_queryset to profile filter.
#profile_queryset = profile.objects.filter(belong_queryset)  

添加的模型。

#model
class profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,)
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=150, blank=True)



class belong(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE,related_name='user_profile')
    group = models.ForeignKey(group, on_delete=models.CASCADE)
    approval = models.IntegerField(default=0)

对不起,英语不好,谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用两个连续的下划线(__)来查看关系:

context_data = super(members,self).get_context_data(**kwargs)
profile_queryset = profile.objects.filter(
    user__user_profile__group__belong__user=self.request.user
)
# ...

因此,过滤器名称包含以下部分:

       related belong   belongs of group
       _____^____           __^_
      /          \         /    \  
user__user_profile__group__belong__user
\_ /                \_ _/          \ _/
  v                   v             v
user of profile   group of belong  user of belong

您可以进行额外的检查,以检查belong是否获得批准:

context_data = super(members,self).get_context_data(**kwargs)
profile_queryset = profile.objects.filter(
    user__user_profile__group__belong__user=self.request.user,
    user__user_profile__approval=1,
    user__user_profile__group__belong__approval=1
)
# ...