Django REST API не возвращает все объекты

У меня есть модель "Инструмент", который включает в себя поле "Активный".

Когда я иду в остальные API, кажется, что все инструменты перечислены, но я нашел один, который никогда не появляется. Это правда, хотя и соответствует критериям.

Вот как определяется набор видов инструментов:

class InstrumentViewSet(viewsets.ModelViewSet):
    serializer_class = serializers.InstrumentSerializer
    queryset = models.Instrument.objects.filter(active=True)
    lookup_field = ('slug')
    permissions = (permissions.IsAuthenticated)

    def get_queryset(self):

        plant = self.request.query_params.get('plant', None)
        location = self.request.query_params.get('location', None)
        name = self.request.query_params.get('name', None)
        issue = str2bool(self.request.query_params.get('issue', False))
        attn = str2bool(self.request.query_params.get('attn', False))
        pastdue = str2bool(self.request.query_params.get('pastdue', False))
        active_issues = str2bool(self.request.query_params.get('active_issues', False))
        active_pastdue = str2bool(self.request.query_params.get('active_pastdue', False))
        active_due = str2bool(self.request.query_params.get('active_due', False))
        since = self.request.query_params.get('since', None)

        if active_issues:
            return queries.get_active_issues(self.request.user, None, None)
        elif active_pastdue:
            return queries.get_past_due(self.request.user, None, None)
        elif active_due:
            return queries.get_due(self.request.user, None, None)
        queryset = models.Instrument.objects.filter(location__plant__in=self.request.user.plants.all())
        if plant is not None:
            queryset = queryset.filter(location__plant__pk=plant)
        if location is not None:
            queryset = queryset.filter(location__pk=location)
        if name is not None:
            queryset = queryset.filter(Q(name__contains=name)|Q(location__name__contains=name))
        if issue:
            queryset = queryset.filter(active_issue=issue)
        if attn:
            queryset = queryset.filter(attention=attn)
        if pastdue:
            queryset = queryset.filter(past_due=pastdue)
        if since is not None:
            last_time = datetime.strptime(since, '%Y-%m-%d %H:%M:%S')
            queryset = queryset.filter(date_edited__gte=last_time)
        return queryset

Он должен возвращать все инструменты, где active = true, который я имею в виду, но он не отображается.

Может ли это быть что-то делать с какими-либо пакетами? Я попытался протестировать его на другом компьютере, и прибор появился тогда.

Текущий сервер работает в Ubuntu, и я попытался обновить некоторые пакеты, но я получаю сообщение об ошибке компилятора, в котором говорится, что он действителен в ObjC, но не в C++.

Я просто не знаю, что делать на данный момент.

1 ответ

Из документа DRF о get_queryset(),

Возвращает набор запросов, который должен использоваться для представлений списка, и который должен использоваться в качестве основы для поиска в подробных представлениях. По умолчанию возвращается набор запросов, указанный queryset приписывать.

Что означает, DRF изучает queryset атрибут, только если вы не переопределяете get_queryset() метод
Итак, вы должны пересмотреть логику queryset приписывать get_queryset() как,

class InstrumentViewSet(viewsets.ModelViewSet):
    serializer_class = serializers.InstrumentSerializer
    queryset = models.Instrument.objects.filter(active=True)
    lookup_field = ('slug')
    permissions = (permissions.IsAuthenticated)

    def get_queryset(self):
        if some_default_logic:
            return models.Instrument.objects.filter(active=True)
        # rest of the code
Другие вопросы по тегам