django ORM-排除在M2M上,F函数不起作用



我有以下型号:

class Activity(models.Model):
user = models.ForeignKey(User, related_name='activities')
project = models.ForeignKey(Project, related_name='activities')

class Project(models.Model):
assignees = models.ManyToManyField(User, related_name='projects')

现在我想查询属于一个不在项目受托人中的用户的所有活动。

我的查询:

Activity.objects.exclude(project__assignees=F('user'))

问题是,我总是得到这个错误:

django.db.utils.OperationalError:(1054,"on clause"中的未知列"U2.id"(

我正在开发django 2.2.11和MySQL。

我发现了几个旧的django bug,但它们应该是很久以前就修复的。

有什么想法可以解决我的问题吗?我的活动表很大,我需要一种高效的方式。我很乐意不使用原始查询。

看起来这是一个错误,因为在生成的查询中,U2表甚至没有定义。您可能需要在Django的票务系统中提交一张机票。

然而,您可以通过注释然后过滤来解决问题:

from django.db.models import Exists, OuterRef
Activity.objects.annotate(
valid=~Exists(Project.objects.filter(
activities=OuterRef('pk'),
assignees=OuterRef('user')
))
).filter(valid=True)

或者从django-3.0开始,您可以直接在Exists上进行过滤:

from django.db.models import Exists, OuterRef
Activity.objects.filter(
~Exists(Project.objects.filter(
activities=OuterRef('pk'),
assignees=OuterRef('user')
))
)

最新更新