我有以下型号:
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子句'中的未知列'U2.id'”)]
我正在django 2.2.11和MySQL上工作。
[我发现了几个old django bugs,但从古以来就应该固定了。
关于如何解决问题的任何想法?我的活动表很大,我需要一种有效的方法。我很高兴不使用原始查询。
谢谢!
看来这是一个错误,因为在生成的查询中甚至没有定义U2
表。您可能要提交ticket at Django's ticketing system。
但是您可以通过注释然后过滤来解决问题:
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')
))
)