Add support for runtime queryset method

Allow passing runtime queryset to FilteredPrimaryKeyRelatedField
using a method name via the source_queryset_method attribute
or a default method name of "get_<field_name>_queryset".

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-03-17 17:53:30 -04:00
parent 7aa4b480d7
commit 62c92ba6fd

View File

@@ -16,6 +16,7 @@ class FilteredPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField):
self.source_model = kwargs.pop('source_model', None)
self.source_permission = kwargs.pop('source_permission', None)
self.source_queryset = kwargs.pop('source_queryset', None)
self.source_queryset_method = kwargs.pop('source_queryset_method', None)
super(FilteredPrimaryKeyRelatedField, self).__init__(**kwargs)
def get_queryset(self):
@@ -31,9 +32,17 @@ class FilteredPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField):
# Ensure queryset is re-evaluated whenever used.
queryset = queryset.all()
else:
raise ImproperlyConfigured(
'Need to provide a source_model or a source_queryset'
method_name = self.source_queryset_method or 'get_{}_queryset'.format(
self.field_name
)
try:
queryset = getattr(self.parent, method_name)()
except AttributeError:
raise ImproperlyConfigured(
'Need to provide a source_model, a '
'source_queryset, a source_queryset_method, or '
'a method named "%s".' % method_name
)
assert 'request' in self.context, (
"`%s` requires the request in the serializer"