Ist es korrekt, dass die Filterung nach einer Liste von Werten in django_filter und durch das Django Rest Framework (DRF) zu kompliziert bleibt oder fehlt mir etwas Einfaches?django_filter Django Rest Framework (DRF) Handhabung query_params get vs getlist
Insbesondere müssen wir a-priori die Parameter angeben, die mit 'getlist' anstatt mit 'get', wenn wir einen Mehrwert Parameter via URL wie unten abgegeben verarbeiten behandelt werden sollte:
http://example.com?country=US&country=CN
wenn wir nun bearbeiten diese Anfrage,
request.query_params.get ('Land') sowie request.query_params [ 'Land'] fälschlicherweise zurückkehren 'KN' während r equest.query_params.getlist ('country') gibt ['US', 'CN'] zurück, was wir in diesem Beispiel wünschen.
Also meine aktuelle Logik diktiert, dass ich im Voraus angeben, welche Parameter haben können mehrere Werte angegeben, da ich von einem internen Verfahren nicht wissen, dass diese transparent behandelt:
So dies zu handhaben ich momentan tun so etwas wie dieses (alle die tatsächliche Anforderungsverarbeitung Skipping, Filtern usw. aus Gründen der Einfachheit):
class CountryFilter(filters.FilterSet):
""" placeholder: this is a separate question as to why I can't get any of these to work as desired. """
#country = filters.CharFilter(method='filter_country')
#country = filters.CharFilter(name='country', lookup_expr='in')
#country = filters.MultipleChoiceFilter()
class CountryViewSet(viewsets.ModelViewSet):
"""Viewset to work with countries by ISO code"""
def list(self, request, *args, **kwargs):
"""do something based on a request for one or more countries
such as http://example.com?country=CA&country=CN&country=BR
"""
query_params = request.query_params
filter0 = CountryFilter(query_params, queryset=Country.objects.all())
# if filter0 worked, we'd be done and wouldn't need below
# but it doesn't
query_dict = {}
params_to_list = ['country', 'another_param']
for k in query_params.keys():
if k in params_to_list:
query_dict[k] = query_params.getlist(k)
else:
query_dict[k] = query_params.get(k)
# use the newly counstructed query_dict rather than query_params
filter1 = CountryFilter(query_dict, queryset=Country.objects.all())
import pdb; pdb.set_trace()
return HttpResponse('ok')
theoretisch filter1 sollte geben Sie mir die gewünschten Ergebnisse, während filter0 nicht.
Code, der auf dieser basiert, funktioniert in meiner Produktionsumgebung, hat aber einige andere Effekte wie die gültige Liste wieder in eine Zeichenfolge umzuwandeln. Ich möchte hier nicht auf diese Frage eingehen, ich frage mich nur, ob die Leute das tun oder nicht?