【问题标题】:Django Ordering by property fieldDjango 按属性字段排序
【发布时间】:2017-09-18 14:44:55
【问题描述】:

我正在使用“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

可以订购吗?

【问题讨论】:

    标签: python django django-rest-framework django-rest-framework-filters


    【解决方案1】:

    所以,经过研究和反复试验,这就是解决方案:

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

    【讨论】:

    • 非常感谢,非常感谢,完美运行!
    【解决方案2】:

    您可以订购并获取 values 属性, 但您可以按相关字段排序,例如

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

    【讨论】:

    • 我想允许使用查询参数从客户端执行此操作 - '?ordering=spec_identifier' 使用 OrderingfFilter,与其他字段相同
    • 您是否尝试在查询字符串中使用?ordering=spec__identifier 双下划线?
    【解决方案3】:

    请尝试以下代码。

    class ItemViewSet(BaseViewMixin, MyModelView):
        permission_classes = [MyItemViewPermissions]
        serializer_class = ItemSerializer
        filter_backends = (ItemFilter, OrderingFilter,) 
        ordering_fields = ('spec__identifier',)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-09
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 2012-09-30
      相关资源
      最近更新 更多