В приложении Django REST framework у меня есть следующие модели:
class Experiment(models.Model):
person = models.CharField(max_length=255, default=None, blank=True, null=True)
class Level(models.Model):
chamber = models.CharField(max_length=255, default=None, blank=True, null=True)
experiment = models.ForeignKey(Experiment, related_name='levels', on_delete=models.CASCADE)
class Run(models.Model):
film = models.CharField(max_length=255)
level = models.ForeignKey(Level, related_name='runs', on_delete=models.CASCADE)
Пользователь может запрашивать данные, передавая фильтры в представление.
@api_view(['POST'])
def get_filtered_data(request):
if (request.method == 'POST'):
query = Q()
if request.data['people'] is not None and len(request.data['people']) > 0:
query = query & Q(person__in=request.data['people'])
if request.data['chambers'] is not None and len(request.data['chambers']) > 0:
query = query & Q(levels__chamber__in=request.data['chambers'])
if request.data['films'] is not None and len(request.data['films']) > 0:
query = query & Q(levels__runs__film__in=request.data['films'])
exp_qs = Experiment.objects.filter(query).distinct()
serializer = ExperimentSerializer(exp_qs, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
else :
return Response('Not a valid API call', status=status.HTTP_400_BAD_REQUEST)
Я хочу чтобы получить все эксперименты, соответствующие спецификациям c chamber
и film
, но я хочу, чтобы результирующие эксперименты включали только отфильтрованные камеры и пленки . Прямо сейчас он возвращает их все
Текущее поведение
С запросом:
{"chambers":["2B"], "people":[], "films": ["Film1"]}
Возвращает
[
{
"person": "me",
"levels": [
{
"chamber": "1A",
runs: [
{ "film": "Film1" },
{ "film": "Film2" }
]
},
{
"chamber": "2B",
runs: [
{ "film": "Film1" },
{ "film": "Film2" }
]
}
]
}
]
Желаемое поведение
По запросу:
{"chambers":["2B"], "people":[], "films": ["Film1"]}
Возврат
[
{
"person": "me",
"levels": [
{
"chamber": "2B",
runs: [
{ "film": "Film1" }
]
}
]
}
]