I'm trying to build some kind of API, but I need to filtering request against query parameters in the URL (http:// ... / ?arg1=foo1&arg2=foo2&...). In my model scheme, I used a many to many relationships. Here is some of my code:
my_app/models.py
from django.contrib.postgres.fields import JSONField
from django.db import models
class MyData(models.Model):
name = models.CharField(max_length=20)
values = JSONField()
class MyModel(models.Model):
time = models.DateTimeField()
country = models.CharField(max_length=50)
data = models.ManyToManyField(MyData)
my_app/serializers.py
from rest_framework import serializers
from my_app.models import MyModel, MyData
class MyDataSerializer(serializers.ModelSerializer):
class Meta:
model = MyData
fields = ('name', 'values',)
class MyModelSerializer(serializers.ModelSerializer):
data = MyDataSerializer(many=True, read_only=True)
class Meta:
model = MyModel
fields = ('country', 'data',)
my_app/views.py
from rest_framework import generics
from my_app.serializers import MySerializer
from my_app.models import MyModel
class MyView(generics.ListAPIView):
serializer_class = MySerializer
def get_queryset(self):
queryset = MyModel.objects.all()
names = self.request.query_params.get('Simon', None)
if names:
queryset = queryset.filter(data__name__in=names.split(','))
return queryset
and here are the responses
Response to http://127.0.0.1:8000/hello/
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
[
{
"country": "Spain",
"data": [
{
"name": "Mark",
"values": {"A": "Hello, it's Wario"}
},
{
"name": "Simon",
"values": {"A": "Hello, it's Mario"}
},
]
},
{
"country": "Italy",
"data": [
{
"name": "Jake",
"values": {"A": "Hello, it's Luigi"}
}
]
}
]
Response to http://127.0.0.1:8000/hello/?name=Simon
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
[
{
"country": "Spain",
"data": [
{
"name": "Mark",
"values": {"A": "Hello, it's Wario"}
},
{
"name": "Simon",
"values": {"A": "Hello, it's Mario"}
},
]
}
]
But the response I wanna to obtain when I request ?name=Simon is:
Response to http://127.0.0.1:8000/hello/?name=Simon
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
[
{
"country": "Spain",
"data": [
{
"name": "Simon",
"values": {"A": "Hello, it's Mario"}
}
]
}
]