peeringdb-mirror/peeringdb_api/views.py

33 lines
1 KiB
Python
Raw Normal View History

2024-04-12 22:20:43 -04:00
from django.db.models import IntegerField, QuerySet
from django.http import JsonResponse
from django.views.generic.list import BaseListView
2024-04-12 21:06:08 -04:00
2024-04-12 22:20:43 -04:00
from peeringdb_api.serializer import serialize_many
def format_for_field(field, value):
if isinstance(field, IntegerField):
return int(value)
return value
class PeeringDBListView(BaseListView):
def get(self, request, *args, **kwargs):
queryset: QuerySet = self.model.objects.all()
for k, v in self.request.GET.items():
_, final_field, _, _ = queryset.query.names_to_path(k.split('__'), self.model._meta)
try:
if k.endswith('__in'):
value = [format_for_field(final_field, i) for i in v.split(',')]
else:
value = format_for_field(final_field, v)
except ValueError:
return JsonResponse({'data': [], 'meta': {'error': 'Entity not found'}}, status=404)
queryset = queryset.filter(**{k: value})
return JsonResponse({'data': serialize_many(queryset)})