Django plusieurs filtrage de champ dans POST

voix
0

J'ai une table de restaurant avec des domaines tels que outlet_type et cuisine_type, qui dispose d'une table cuisine_type de cuisine (pk, cuisine_type) et outlet_type a une table de sortie (pk, outlet_type). Il y a plus de domaines tels que is_vegeterian_friendly, accessibilité financière et ainsi de suite. L'utilisateur est libre de choisir un domaine qu'ils veulent jeter le filtre et je ne veux pas créer une combinaison des champs pour traiter chaque demande. C'est la folie.

L'utilisateur peut appliquer le filtre sur un champ dans le corps d'une requête POST comme ci-dessous:

{
    outlet_type:  1, 
    cuisine_type: 2,
    ...
}

La vue retourne une liste de restaurants après le filtre

class RestaurantList(APIView):
    def post(self, request, format=None):
        filter = dict(request.data)
        retaurants = Restaurant.objects.filter(**filter)
        serializer = RestaurantSerializer(retaurants, many=True)
        return Response(serializer.data)

Cependant, quand il y a plusieurs choix dans un champ, par exemple, ils veulent filtrer plusieurs tels que 1 cuisine_type et 2, puis le corps de la demande doivent ajouter __in afin de rendre cela fonctionne.

{
    outlet_type:  1, 
    cuisine_type__in: [1, 2],
    ...
}

Une meilleure façon de le faire? J'attends que nous ne avons pas besoin de modifier le nom de la clé et nous venons de faire la valeur sous forme de tableau tels que:

{
    outlet_type:  1, 
    cuisine_type: [1, 2],
    ...
}
Créé 20/10/2018 à 02:52
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Vous devriez essayer le django-filtre lib pour le filtrage. Il est très simple à utiliser et offre une gamme d'options de filtrage.

Pour votre cas, vous pourriez commencer par quelque chose comme ceci:

class RestaurantFilter(django_filters.FilterSet):
    #use appropriate field names below.
    outlet_type = django_filters.CharFilter(name="outlet_type", lookup_type="contains")
    cuisine_type = django_filters.CharFilter(name="cuisine_type", lookup_type="contains")

class Meta:
    model = Restaurant
Créé 28/10/2018 à 01:08
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more