Может Django наборов запросов фильтровать и детей, и родителей - PullRequest
0 голосов
/ 06 августа 2020

В приложении 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" }
          ]
       }
     ]
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...