Don't lose our prefetches when invoking guardian and fetch the custom field__field, which we actually use

This commit is contained in:
Trenton H
2026-04-12 13:49:48 -07:00
parent fdd5e3ecb2
commit 002c5b0a20
2 changed files with 10 additions and 4 deletions

View File

@@ -884,10 +884,16 @@ class ObjectOwnedOrGrantedPermissionsFilter(ObjectPermissionsFilter):
"""
def filter_queryset(self, request, queryset, view):
# django-guardian's get_objects_for_user builds its own queryset
# internally and loses prefetch_related declarations. Use its result
# as a subquery so we can filter the original queryset (which retains
# all prefetch hints) rather than returning guardian's queryset directly.
objects_with_perms = super().filter_queryset(request, queryset, view)
objects_owned = queryset.filter(owner=request.user)
objects_unowned = queryset.filter(owner__isnull=True)
return objects_with_perms | objects_owned | objects_unowned
return queryset.filter(
Q(pk__in=objects_with_perms)
| Q(owner=request.user)
| Q(owner__isnull=True),
)
class ObjectOwnedPermissionsFilter(ObjectPermissionsFilter):

View File

@@ -919,7 +919,7 @@ class DocumentViewSet(
),
),
"tags",
"custom_fields",
"custom_fields__field",
"notes",
)
)