Django REST API不会返回所有对象

时间:2018-08-16 20:13:35

标签: django django-rest-framework django-rest-viewsets

我有一个“工具”模型,其中包括一个“活动”字段。

当我进入其余的api时,似乎列出了所有的Instruments,但是我发现其中的一件从未出现过。即使符合条件也是如此。

这是“仪器”视图集的定义方式:

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 个答案:

答案 0 :(得分:0)

reprex package

  

返回应用于列表视图的查询集,该查询集应用作详细视图中查找的基础。 默认返回由queryset属性指定的查询集。

这意味着,仅当您不覆盖queryset方法时,DRF才会查看 get_queryset() 属性
因此,您必须 重新定义 querysetget_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