在django rest框架中使用过滤器获取最新对象

时间:2016-08-10 09:50:29

标签: python django django-rest-framework

当我通过DRF API请求GET时,我想返回最新的对象。 我在views.py中试过这个:

class ListCreateNodeConfig(generics.ListCreateAPIView):
    queryset = models.NodeConfig.objects.all()
    serializer_class = serializers.NodeConfigSerializer

    def get_queryset(self):
        return self.queryset.filter(node_id=self.kwargs.get('node_pk')).latest('timestamp')

但它会引发错误:' NodeConfig'对象不可迭代

models.py

class NodeConfig(models.Model):  
    node_id = models.ForeignKey(Node)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    record_interval = models.IntegerField(default=0)
    lower_frequency = models.IntegerField(default=0)
    upper_frequency = models.IntegerField(default=0)

如何解决?

任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:5)

这里的问题是latest()方法。这不会返回查询集,而是返回单个模型实例。 (如get(...)

所以使用:

def get_queryset(self):
    return self.queryset.filter(node_id=self.kwargs.get('node_pk')).order_by('-timestamp')

因此,如果您想为单个对象设置端点,则不得使用DRF List* views / mixins。 列表视图假设您要使用列表(=多个对象)。所以他们依赖queryset resp。 get_queryset。并且查询集显然应该是查询集而不是模型实例...

但是还有RetrieveAPIView视图:

from rest_framework.generics import RetrieveAPIView

class LatestNodeConfigView(RetrieveAPIView):
    queryset = models.NodeConfig.objects.all()
    # add your serializer
    serializer_class = NodeConfigDetailSerializer

    def get_object(self, *args, **kwargs):
        return self.queryset.filter(node_id=kwargs.get('node_pk')).latest('timestamp')

答案 1 :(得分:0)

您还可以使用python切片将单个对象返回到queryset:

$options = app('request')->header('accept-charset') == 'utf-8' ? JSON_UNESCAPED_UNICODE : null;
return response()->json([
            'card' => $card[0],
            'company' => $company[0],
            'identity' => $identity[0],
            'haulier_declarations' => $relation,
        ], 200, [], $options);