使用Django排除过滤器处理空的多对多字段问题

0 投票
1 回答
1008 浏览
提问于 2025-04-16 16:13

我构建的查询结果不太对,有些项目被遗漏了。我在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模型)参与的案件是有效的。但是,它没有返回那些没有任何代理人的案件。我觉得这可能是因为没有代理人的案件在连接UserProfiles和Cases的中间表里没有记录。

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

案件/代理人

案件1:汤姆,史蒂夫

案件2:史蒂夫

案件3:简

案件4:没人

我的查询会返回案件2和案件3,但不会返回案件4。我想把案件4也包括进去。

抱歉如果这说得不太清楚,任何帮助都很感激。

1 个回答

1

这个问题有点不太清楚,但这个查询是不是不能用来获取所有没有分配给那个用户的案例呢?

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

如果你想获取那些属于用户所在组织但没有分配给他的案例,或者没有分配给任何人的案例,这个查询应该可以用。

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

撰写回答