Skip to content

Instantly share code, notes, and snippets.

@tinytengu
Last active June 27, 2022 14:46
Show Gist options
  • Save tinytengu/7aab838b38d15ebc2c6958ceb7061955 to your computer and use it in GitHub Desktop.
Save tinytengu/7aab838b38d15ebc2c6958ceb7061955 to your computer and use it in GitHub Desktop.
Miltiple field lookup mixin for Django Rest Framework
from django.shortcuts import get_object_or_404
class MultipleFieldLookupMixin:
lookup_ignorecase = True
def get_object(self):
queryset = self.get_queryset()
queryset = self.filter_queryset(queryset)
filter = {
"{}{}".format(
field, "__iexact" if self.lookup_ignorecase else ""
): self.kwargs[field]
for field in self.lookup_fields
if self.kwargs.get(field)
}
obj = get_object_or_404(queryset, **filter)
self.check_object_permissions(self.request, obj)
return obj
@tinytengu
Copy link
Author

tinytengu commented Jun 27, 2022

from functools import reduce
from django.db.models import Q
from django.shortcuts import get_object_or_404

class MultipleFieldLookupMixin:
    lookup_fields = ("pk",)
    lookup_ignorecase = True

    def get_object(self):
        queryset = self.get_queryset()
        queryset = self.filter_queryset(queryset)
        filter = {
            "{}{}".format(
                field, "__iexact" if self.lookup_ignorecase else ""
            ): self.kwargs[self.lookup_field]
            for field in self.lookup_fields
        }

        obj = get_object_or_404(
            queryset, reduce(lambda x, y: Q(x) | Q(y), filter.items())
        )
        self.check_object_permissions(self.request, obj)
        return obj

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment