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