django ORM-在F功能不起作用的M2M上排除

问题描述 投票:2回答:1

我有以下型号:

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,但从古以来就应该固定了。

关于如何解决问题的任何想法?我的活动表很大,我需要一种有效的方法。我很高兴不使用原始查询。

谢谢!

mysql django django-orm
1个回答
2
投票

看来这是一个错误,因为在生成的查询中甚至没有定义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)

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

from django.db.models import Exists, OuterRef

Activity.objects.filter(
    ~Exists(Project.objects.filter(
        activities=OuterRef('pk'),
        assignees=OuterRef('user')
    ))
)
© www.soinside.com 2019 - 2024. All rights reserved.