使用django排除过滤问题与空m2m字段

时间:2011-04-22 03:25:54

标签: python django orm

我构建的查询集错误地遗漏了一些项目。我在Django中有三个模型:

class Case(models.Model):
    agents = models.ManyToManyField('UserProfile', related_name='agent_of', blank=True, null=True)
    organization = models.ForeignKey(Organization, related_name='case_org')


class UserProfile(models.Model):
    name = models.CharField(max_length=40)
    user = models.ForeignKey(User, unique=True, related_name='user_profile')
    organization = models.ForeignKey(Organization, related_name='org_members', blank=True, null=True)

class Organization(models.Model):
    name = models.CharField(max_length=75)

我正在尝试构建未分配案例列表。也就是说,当前用户不是代理的情况,包括根本没有代理分配给他们的情况。这是我的疑问:

Case.objects.filter(
             organization=request.user.user_profile.get().organization.id).exclude
             (Q(agents__user=request.user))

这适用于分配给其他代理(UserProfile模型)的情况。但它不会返回分配给它们的NO代理的情况。我很确定这与没有为其分配代理的情况在连接UserProfiles和Cases的中间表中没有行这一事实有关。

换句话说,如果我有这些案例:

案例/代理

案例1:汤姆,史蒂夫

案例2:史蒂夫

案例3:简

案例4:没有人

我的查询将返回Case2和Case3,但不会返回Case4。试图将Case4包括在内。

对不起,如果不是很清楚,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

问题有点不清楚但是这个查询不能解决所有未分配给该用户的案例吗?

Case.objects.exclude(agents=request.user)

如果您试图让属于用户组织且未分配给他未分配给任何人,则该功能应该有效。

Case.objects.filter(Q(organization=organization)|Q(agents=None)).exclude(agents=request.user)