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

Python 在django rest框架中使用过滤器获取最新对象,python,django,django-rest-framework,Python,Django,Django Rest Framework,当我请求通过DRFAPI时,我想返回最新的对象。 我在views.py中尝试了这个: class ListCreateNodeConfig(generics.ListCreateAPIView): queryset = models.NodeConfig.objects.all() serializer_class = serializers.NodeConfigSerializer def get_queryset(self): return self

当我请求通过DRFAPI时,我想返回最新的对象。 我在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)
如何修复它


如有任何建议,我们将不胜感激

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

因此,请使用:

def get_queryset(self):
    return self.queryset.filter(node_id=self.kwargs.get('node_pk')).order_by('-timestamp')
因此,如果要为单个对象创建端点,则不能使用DRF
List*
views/mixin。
ListView假定您希望使用列表(=多个对象)。因此他们依赖于
queryset
resp<代码>获取查询集。一个queryset显然应该是一个queryset而不是一个模型实例

但也包含了
RetrieveAppView
视图:

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')

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

self
  .queryset
  .filter(node_id=self.kwargs.get('node_pk'))
  .order_by('-timestamp')[:1]

应该有一个返回到最新方法的列表。我不这么认为,这就是本例中发生的情况。filter()返回Queryset,根据本文档,Queryset是可编辑的。我无法理解它为什么不起作用。您不应该同时定义
queryset
get\u queryset
。可能不是这里的问题-但仍然。。。因此,请删除
queryset
属性,并将
self.queryset…
替换为
models.NodeConfig.objects…
@ohrstrom是的,我在没有queryset的情况下尝试过这个方法,但仍然没有成功:返回models.NodeConfig.objects.filter(node\u id=self.kwargs.get('node\u pk'))。最新('timestamp')),该代码在纯Django函数中工作(不在DRF中)。我还可以提取Django shell中的最新版本。也许我的模型有问题?我需要添加元类还是其他选项?我在问题中添加了模型是的,我想要一个模型实例(单个对象)。我也试过了,但同样的错误。return models.NodeConfig.objects.filter(node_id=self.kwargs.get('node_pk')).order_by('-timestamp')[0]latest和order_by之间的区别是latest返回单个对象,而order_则返回多个。所以改变这一点不会影响这里的问题。