Python 在django rest框架中使用过滤器获取最新对象
当我请求通过DRFAPI时,我想返回最新的对象。 我在views.py中尝试了这个: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
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')
因此,如果要为单个对象创建端点,则不能使用DRFList*
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_则返回多个。所以改变这一点不会影响这里的问题。