django ORM - 在 F 函数不起作用的 M2M 上排除
django ORM - Exclude on M2M with F-function not working
我有以下型号:
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, "Unknown column 'U2.id' in 'on clause'")
我正在使用 django 2.2.11 和 MySQL。
我找到了几个 old django bugs 但它们应该已经修复很久了。
有什么办法可以解决我的问题吗?我的 activity table 很大,我需要一种有效的方法。我很乐意不使用原始查询。
谢谢!
看起来这是一个错误,因为在生成的查询中,甚至没有定义 U2
table。您可能想要提交 ticket at Django's ticketing system.
然而,您可以通过注释然后过滤来解决问题:
from django.db.models import Exists, OuterRef
Activity.objects.annotate(
<b>valid=</b>~Exists(Project.objects.filter(
activities=OuterRef('pk'),
assignees=OuterRef('user')
))
).filter(<b>valid=True</b>)
或从 django-3.0 开始,您可以直接在 Exists
上进行过滤:
from django.db.models import Exists, OuterRef
Activity.objects.filter(
~Exists(Project.objects.filter(
activities=OuterRef('pk'),
assignees=OuterRef('user')
))
)
我有以下型号:
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, "Unknown column 'U2.id' in 'on clause'")
我正在使用 django 2.2.11 和 MySQL。
我找到了几个 old django bugs 但它们应该已经修复很久了。
有什么办法可以解决我的问题吗?我的 activity table 很大,我需要一种有效的方法。我很乐意不使用原始查询。
谢谢!
看起来这是一个错误,因为在生成的查询中,甚至没有定义 U2
table。您可能想要提交 ticket at Django's ticketing system.
然而,您可以通过注释然后过滤来解决问题:
from django.db.models import Exists, OuterRef
Activity.objects.annotate(
<b>valid=</b>~Exists(Project.objects.filter(
activities=OuterRef('pk'),
assignees=OuterRef('user')
))
).filter(<b>valid=True</b>)
或从 django-3.0 开始,您可以直接在 Exists
上进行过滤:
from django.db.models import Exists, OuterRef
Activity.objects.filter(
~Exists(Project.objects.filter(
activities=OuterRef('pk'),
assignees=OuterRef('user')
))
)