Django 从2.2.x迁移到3.x时出现批注语法错误

Django 从2.2.x迁移到3.x时出现批注语法错误,django,Django,我正在从Django 2.2迁移到3.2。在解决了大多数弃用问题之后,我在整个项目中依赖的注释抛出了一个语法错误。我使用哪一个3.x版本似乎无关紧要,此注释在2.2.x的大多数版本中都有效: Journal.objects.annotate( p_user=F('assignment__courses__participation__user'), can_have_journal=F('assignment__courses__participation__role__can_

我正在从Django 2.2迁移到3.2。在解决了大多数弃用问题之后,我在整个项目中依赖的注释抛出了一个语法错误。我使用哪一个3.x版本似乎无关紧要,此注释在2.2.x的大多数版本中都有效:

Journal.objects.annotate(
    p_user=F('assignment__courses__participation__user'),
    can_have_journal=F('assignment__courses__participation__role__can_have_journal'),
).filter(
    Q(assignment__is_group_assignment=True) | Q(p_user__in=F('authors__user'), can_have_journal=True),
)
这会产生以下错误:

django.db.utils.ProgrammingError: syntax error at or near ""VLE_assignmentparticipation""
LINE 1: ...ave_journal" AND "VLE_participation"."user_id" IN "VLE_assig...
跟踪的一部分:

venv/lib/python3.8/site-packages/django/db/models/query.py:317: in __getitem__
    qs._fetch_all()
venv/lib/python3.8/site-packages/django/db/models/query.py:1324: in _fetch_all
    self._result_cache = list(self._iterable_class(self))
venv/lib/python3.8/site-packages/django/db/models/query.py:51: in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
venv/lib/python3.8/site-packages/django/db/models/sql/compiler.py:1169: in execute_sql
    cursor.execute(sql, params)
venv/lib/python3.8/site-packages/sentry_sdk/integrations/django/__init__.py:434: in execute
    return real_execute(self, sql, params)
venv/lib/python3.8/site-packages/django/db/backends/utils.py:66: in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
venv/lib/python3.8/site-packages/django/db/backends/utils.py:75: in _execute_with_wrappers
    return executor(sql, params, many, context)
venv/lib/python3.8/site-packages/django/db/backends/utils.py:84: in _execute
    return self.cursor.execute(sql, params)
venv/lib/python3.8/site-packages/django/db/utils.py:90: in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
好的措施

如果我在过滤块中删除or:
|Q(p_user_uuuin=F('authors_uuser'),可以让_journal=True)
,则注释可以正常工作

我在发行/弃用说明中找不到任何关于注释更改的内容,有人对潜在问题有什么建议吗?

最终找到了相关的(另请参阅)

SQL语法错误对于贯穿2.2.x的行为来说是相当不友好的

对于发布的代码片段,这将在维护SQL时解决问题:
p\u user\uu in=F('authors\uu user')
->
p\u user=F('authors\uu user')