Django按属性字段排序

4
我正在使用“OrderingFilter”来允许排序。根据Django文档,如果未指定“ordering_fields”,则可以按照视图序列化器中提到的任何字段进行排序。我有一个基本上是序列化器中的@property字段。但是当尝试按该字段排序时,我会收到以下错误:
Cannot resolve keyword 'spec_identifier' into field. Choices are:....

这是模型视图的一部分:
class ItemViewSet(BaseViewMixin, MyModelView):
    permission_classes = [MyItemViewPermissions]
    serializer_class = ItemSerializer
    filter_backends = (ItemFilter, OrderingFilter,)

我想按照以下属性定义进行排序:

@property
def spec_identifier(self):
    return self.spec.identifier if self.spec else None

它可以按顺序排序吗?

3个回答

2

所以,在研究和试错之后,这就是解决方案:

ordering_fields = tuple(serializer_class.Meta.fields + ['spec__identifier'])

非常好,谢谢,太棒了,完美运行! - user13641468

0

你可以按照值属性进行排序和获取,但是你也可以按照相关字段进行排序,例如

Item.objects.all().order_by('spec__identifier')

我想允许客户端使用查询参数'?ordering=spec_identifier'来执行此操作,使用OrderingFilter,与其他字段相同。 - user2880391
1
你尝试在查询字符串中使用双下划线__作为spec_identifier的排序参数了吗? - Brown Bear

0
请尝试以下代码。
class ItemViewSet(BaseViewMixin, MyModelView):
    permission_classes = [MyItemViewPermissions]
    serializer_class = ItemSerializer
    filter_backends = (ItemFilter, OrderingFilter,) 
    ordering_fields = ('spec__identifier',)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接