按子字段对嵌套的Serializer字段的DRF序列化程序输出进行排序

时间:2017-06-07 16:29:01

标签: django sorting django-rest-framework serializer

我有两个序列化程序,其中一个引用另一个many=True关系。

class AttributeInParentSerializer(ModelSerializer):
    masterdata_type = CharField(max_length=256, source='masterdata_type_id')

    class Meta:
        model = Attribute
        fields = ('uuid', 'masterdata_type')

class ArticleInArticleSetSerializer(ModelSerializer):
    attributes = AttributeInParentSerializer(many=True)

    class Meta:
        model = Article
        fields = ('uuid', 'attributes')    

文章中属性的顺序并不总是相同,但我想以相同的顺序输出它们,所以在这种情况下,在字段masterdata_type上排序。我怎么能做到这一点?请注意,如果可能,我不想更改序列化程序的任何客户端,当然也不是任何模型。

4 个答案:

答案 0 :(得分:1)

您可以通过为ArticleInArticleSetSerializer编写视图集来设置ArticleInArticleSetSerializer上的属性顺序。

$request

或者您可以编写一个列出功能。

class ArticleInArticleSetViewSet(viewsets.ModelViewSet):
    serializer_class = ArticleInArticleSetSerializer
    queryset = Article.objects.all().order_by('-attributes_id')

此代码仅供参考

答案 1 :(得分:0)

旧主题,但由于它仍在Google上弹出,因此我也想分享我的答案。尝试覆盖Serializer.to_representation方法。现在,您基本上可以做任何您想做的事情,包括自定义响应的排序。就您而言:

class ArticleInArticleSetSerializer(ModelSerializer):
    attributes = AttributeInParentSerializer(many=True)

    class Meta:
        model = Article
        fields = ('uuid', 'attributes')

    def to_representation(self, instance):
        response = super().to_representation(instance)
        response["attributes"] = sorted(response["attributes"], key=lambda x: x["masterdata_type"])
        return response

答案 2 :(得分:-1)

您无法在ArticleInArticleSetSerializer上设置排名,但可以在attributes上设置AttributeInParentSerializer的排序。这是因为您只能在使用序列化程序时设置排序,而不是在定义序列化时。

您可以在传递查询集或数据时在__init__方法中设置它,但是您正在对传入的内容进行假设。我可能最终会在消费者中指定它ArticleInArticleSetSerializer以避免将列表传递给序列化程序时出现任何问题。

答案 3 :(得分:-2)

您可以在序列化程序中使用order_by,如下所示:

class AttributeInParentSerializer(ModelSerializer):
    masterdata_type = CharField(max_length=256, source='masterdata_type_id')

    class Meta:
        model = Attribute
        fields = ('uuid', 'masterdata_type')
        order_by = (('masterdata_type',))

希望它有所帮助!

<强>更新

看起来我错了。无法从文档中找到它,它似乎不起作用。现在,我认为序列化器不是订购的地方。最好的方法是在模型中或在视图中。