当我通过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)
如何解决?
任何建议都表示赞赏。
答案 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);