我有两个序列化程序,其中一个引用另一个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
上排序。我怎么能做到这一点?请注意,如果可能,我不想更改序列化程序的任何客户端,当然也不是任何模型。
答案 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',))
希望它有所帮助!
<强>更新强>
看起来我错了。无法从文档中找到它,它似乎不起作用。现在,我认为序列化器不是订购的地方。最好的方法是在模型中或在视图中。