rsinger86 / drf-flex-fields

Dynamically set fields and expand nested resources in Django REST Framework serializers.
MIT License
740 stars 61 forks source link

Support for a list of expansions with multiple expand parameters instead of separated by a comma. #137

Open SorianoMarmol opened 11 months ago

SorianoMarmol commented 11 months ago

Hello. First of all, thank you for your work and effort with the library!

We have noticed that, despite expansions working correctly with multiple expansion parameters:

expand=field1&expand=field2 instead of ?expand=field1,field2

the 'is_expanded' function does not respond appropriately due to the use of 'request.query_params.get(EXPAND_PARAM).' In the case of receiving a list, it only returns one of the values.

However, the 'getlist' method does return both fields. I illustrate it with an example:

# expand=field1&expand=field2
ipdb> self.request.query_params
<QueryDict: {'expand': ['asset', 'positions']}>
ipdb> self.request.query_params.getlist('expand')
['field1', 'field2']
ipdb> self.request.query_params.get('expand')
'field2'

In this case, it's already a list.

Would it be possible to manage this scenario as well?

SorianoMarmol commented 11 months ago

Something like that

def is_expanded(request, field: str) -> bool:
    """ Examines request object to return boolean of whether
        passed field is expanded.
    """
    expand_value = request.query_params.getlist(EXPAND_PARAM)
    if not expand_value:
        return False
    expand_fields = []
    if len(expand_value) > 1:  # already a list
        expand_params = expand_value
    else:
        expand_params = expand_value[0].split(",")
    for f in expand_params:
        expand_fields.extend([_ for _ in f.split(".")])

    return any(field for field in expand_fields if field in WILDCARD_VALUES) or field in expand_fields