【问题标题】:How to order by nested objects fields?如何按嵌套对象字段排序?
【发布时间】:2015-11-22 23:14:24
【问题描述】:

我有一些课

class MarketProduct(models.Model, ObjectMarket):
    _state_class = 'MarketProductState'

    uuid = models.UUIDField(u'Код',
                        default=uuid.uuid4, editable=False)
    name = models.CharField(u'Название',
                        max_length=255, db_index=True)
class MarketItem(models.Model, ObjectMarket):
    _state_class = 'MarketItemState'

    STOCK, AUCTION = 1, 2
    ITEM_CHOICES = (
        (STOCK, u'Сток'),
        (AUCTION, u'Аукцион'),
    )

    product = models.ForeignKey(MarketProduct)
    start_at = models.DateTimeField(u'Начало продажи')

我想获取 MarketItemViewSet 并使用

filter_backends = (filters.OrderingFilter,`)

我通过角度发送请求并提交orderby。 如果我发送orderby = start_at,一切都很好,但我想发送 orderby = product.id,不行。

【问题讨论】:

    标签: angularjs django django-rest-framework


    【解决方案1】:

    您可以尝试指定product__id,根据product的id进行排序。

    orderby = product__id
    

    在您的视图集中指定ordering_fields。

    ordering_fields = ('product__id', )
    

    【讨论】:

    • 您是否将排序字段指定为product__id?
    【解决方案2】:

    当您使用 django-rest-framework 时,您必须使用 ordering_fields,正如您从文档 here 中看到的那样。希望对示例有所帮助:

    class UserListView(generics.ListAPIView):
        queryset = User.objects.all()
        serializer_class = UserSerializer
        filter_backends = (filters.OrderingFilter,)
        ordering_fields = ('username', 'email')
        ordering = ('created_on') # for reverse ordering = ('-created_on')
    

    如果在视图上设置了排序属性,这将用作默认排序。

    通常,您可以通过在初始查询集上设置 order_by 来控制它,但是在视图上使用 ordering 参数可以让您以这样一种方式指定排序,然后它可以作为上下文自动传递给呈现的模板

    【讨论】:

    • 感谢 ordering_fields = ('"poduct__id") 并发送 orderby:product__id
    • @AndrewMedvedsky 很高兴为您提供帮助。如果有帮助,请接受答案。
    猜你喜欢
    • 2015-10-24
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2012-11-25
    • 2017-03-07
    • 2018-10-22
    • 2019-10-25
    相关资源
    最近更新 更多