I faced an issue, that my subquery returns False, even it should return True.
from wagtail.models import WorkflowState, Page, Workflow
import pytest
def test_filter_pages(user):
page = PageFactory.create(
owner=user,
live=False,
latest_revision_created_at=timezone.now(),
)
WorkflowState.objects.create(
content_type=ContentType.objects.get_for_model(Article),
base_content_type=ContentType.objects.get_for_model(Page),
object_id=str(page.pk),
workflow=Workflow.objects.get(name="Moderators approval"),
status=WorkflowState.STATUS_IN_PROGRESS,
requested_by=user,
)
workflow_states = WorkflowState.objects.filter(
status=WorkflowState.STATUS_IN_PROGRESS, object_id=str(OuterRef("pk"))
)
queryset = (
Page.objects.select_related("owner", "latest_revision")
.annotate(workflow_state_status=Exists(workflow_states))
.filter(owner=user)
)
lists_ids = [
page.id
for page in queryset
if page.workflow_state_status
]
assert lists_ids != 0
In this test there is only one page, which should have workflow state. But test fails with list_ids = 0. What is wrong here?
Moreover, when I try to replace workflow_state_status
with simple
WorkflowState.objects.filter(
object_id=self.pk,
status=WorkflowState.STATUS_IN_PROGRESS,
).exists()
everything works correct (except database queries)