diff --git a/reviewboard/reviews/detail.py b/reviewboard/reviews/detail.py
index 7e45dc9c60ce98303b8e89dd779d0e9cee337237..76f140dcf87c45cdcb8326c4f74849936904b9a1 100644
--- a/reviewboard/reviews/detail.py
+++ b/reviewboard/reviews/detail.py
@@ -7,8 +7,9 @@ import logging
 from collections import Counter, defaultdict
 from datetime import datetime, timezone
 from itertools import chain
-from typing import (Any, ClassVar, Final, Iterable, Iterator, Mapping,
-                    Optional, Sequence, TYPE_CHECKING, Type, TypeVar, Union)
+from typing import (Any, ClassVar, Final, Iterable, Iterator, List, Mapping,
+                    Optional, Sequence, TYPE_CHECKING, Type, TypeVar, Union,
+                    cast)
 
 from django.contrib.auth.models import AnonymousUser, User
 from django.db.models import Model, Q
@@ -22,7 +23,7 @@ from djblets.util.dates import get_latest_timestamp
 from djblets.util.decorators import cached_property
 from typing_extensions import TypedDict
 
-from reviewboard.diffviewer.models import DiffCommit
+from reviewboard.diffviewer.models import DiffCommit, DiffSet
 from reviewboard.registries.registry import OrderedRegistry
 from reviewboard.reviews.builtin_fields import (CommitListField,
                                                 ReviewRequestPageDataMixin)
@@ -45,7 +46,6 @@ if TYPE_CHECKING:
 
     from reviewboard.attachments.models import FileAttachment
     from reviewboard.changedescs.models import ChangeDescription
-    from reviewboard.diffviewer.models import DiffSet
     from reviewboard.reviews.fields import (
         ReviewRequestFieldChangeEntrySection,
     )
@@ -142,6 +142,9 @@ class ReviewRequestPageData:
     changedescs: Sequence[ChangeDescription]
 
     #: All of the diffsets associated with the review request.
+    #:
+    #: This includes the draft diffset if the draft is accessible by the
+    #: requesting user.
     diffsets: Sequence[DiffSet]
 
     #: A mapping from diffset IDs to instances.
@@ -431,7 +434,13 @@ class ReviewRequestPageData:
 
         # Get diffsets.
         if needs_reviews:
-            diffsets = review_request.get_diffsets()
+            diffsets = cast(List[DiffSet], review_request.get_diffsets())
+
+            if ((draft := self.draft) and
+                (draft_diffset := draft.get_latest_diffset())):
+                # If a draft diffset exists, include it. We've already
+                # checked that the user has access.
+                diffsets.append(draft_diffset)
 
             # We're going to attach the repository to each diffset. This is
             # faster than including them in a select_related(), and ensures
diff --git a/reviewboard/reviews/tests/test_review_request_page_data.py b/reviewboard/reviews/tests/test_review_request_page_data.py
index 7a28ece2d9d4f0113c25371b2d22f6f1ec9f51ef..0de594aff802b45e4b985437122cd05604001850 100644
--- a/reviewboard/reviews/tests/test_review_request_page_data.py
+++ b/reviewboard/reviews/tests/test_review_request_page_data.py
@@ -26,6 +26,7 @@ from reviewboard.reviews.detail import (BaseReviewRequestPageEntry,
                                         ReviewRequestPageData)
 from reviewboard.reviews.models import (BaseComment,
                                         Review,
+                                        ReviewRequest,
                                         ReviewRequestDraft,
                                         Screenshot,
                                         StatusUpdate)
@@ -518,6 +519,53 @@ class ReviewRequestPageDataTests(TestCase):
             expect_changedescs=True,
             expect_status_updates=True)
 
+    def test_query_data_pre_etag_with_draft_diffsets(self) -> None:
+        """Testing ReviewRequestPageData.query_data_pre_etag includes
+        draft diffsets
+        """
+        self._populate_review_request()
+
+        # Create a draft diffset.
+        review_request = self.review_request
+        draft_diffset = self.create_diffset(review_request, draft=True)
+
+        self.diffsets.append(draft_diffset)
+
+        self._test_query_data_pre_etag_with(
+            entry_classes=[ReviewRequestEntry],
+            expected_queries=lambda: [
+                {
+                    'model': Review,
+                    'order_by': ('-timestamp',),
+                    'select_related': {'user'},
+                    'where': (
+                        Q(review_request=self.review_request) &
+                        (Q(public=True) |
+                         Q(user_id=2))
+                    ),
+                },
+                {
+                    'model': ReviewRequest,
+                    'where': Q(id=review_request.pk),
+                },
+                {
+                    'model': User,
+                    'where': Q(id=review_request.owner.pk)
+                },
+                {
+                    'model': DiffSet,
+                    'where': Q(history__pk=1),
+                },
+                {
+                    'model': FileDiff,
+                    'where': Q(diffset__in=list(
+                        DiffSet.objects.filter(history__pk=1))),
+                },
+            ],
+            expect_diffs=True,
+            expect_reviews=True,
+            expect_draft=True)
+
     def test_query_data_post_etag(self) -> None:
         """Testing ReviewRequestPageData.query_data_post_etag"""
         self._populate_review_request()
@@ -1379,6 +1427,62 @@ class ReviewRequestPageDataTests(TestCase):
             expect_comments=True,
             expect_issues=True)
 
+    def test_query_data_post_etag_with_draft_diff_comments(self) -> None:
+        """Testing ReviewRequestPageData.query_data_post_etag with draft
+        diff comments
+        """
+        self._populate_review_request(enable_file_attachments=False,
+                                      enable_screenshots=False)
+
+        # Create a draft diffset.
+        review_request = self.review_request
+        draft_diffset = self.create_diffset(review_request, draft=True)
+        filediff = self.create_filediff(draft_diffset)
+
+        self.diffsets.append(draft_diffset)
+
+        # Create a draft comment owned by the requesting user.
+        review = self.create_review(review_request, user='doc')
+        comment = self.create_diff_comment(review, filediff)
+
+        self.reviews.append(review)
+        self.all_comments.append(comment)
+
+        # Create a draft comment owned by a different user.
+        #
+        # The review won't appear in the page data, but the comment will. The
+        # comment won't actually appear on the page, it gets filtered out in
+        # ReviewsDiffViewerView._get_comments_hint().
+        review_admin = self.create_review(review_request, user='admin')
+        other_comment = self.create_diff_comment(review, filediff)
+
+        self.all_comments.append(other_comment)
+
+        review_pks = [10, 9, 8, 7, 6, 5, 4, 3, 2, 11, 1]
+
+        self._test_query_data_post_etag_with(
+            expected_queries=lambda: [
+                {
+                    'model': Review.general_comments.through,
+                    'order_by': ('generalcomment__timestamp',),
+                    'select_related': True,
+                    'where': Q(review__in=[10, 9, 8, 7, 6, 5, 4, 3, 2, 11, 1]),
+                },
+                {
+                    'model': Review.comments.through,
+                    'order_by': ('comment__filediff',
+                                 'comment__first_line',
+                                 'comment__timestamp'),
+                    'select_related': True,
+                    'where': Q(review__in=review_pks),
+                },
+            ],
+            expect_reviews=True,
+            expect_draft=True,
+            expect_comments=True,
+            expect_issues=True)
+        self.assertNotIn(review_admin.pk, review_pks)
+
     def test_query_data_post_etag_with_no_screenshots(self) -> None:
         """Testing ReviewRequestPageData.query_data_post_etag with no
         screenshots
