每当我在Django中声明一个抽象模型以允许嵌套模型时,Django都会要求我声明一个 str 作为该模型的字符串表示形式。我正在编写的应用程序应该是返回JSON的API,而不是Django返回实际定义为 str 的对象。
示例:
我的模特:
class SomeModel(models.Model):
a = models.CharField()
b = models.CharField()
def __str__(self):
return 'some string'
class Meta:
abstract = True
父模型:
class ParentModel(models.Model):
someModel = models.EmbeddedModelField(
model_container=SomeModel
)
序列化器:
class ParentSerializer(serializers.ModelSerializer):
class Meta:
model = ParentModel
fields = ('someModel')
查看:
class ParentViewSet(viewsets.ModelViewSet):
queryset = ParentModel.objects.all()
serializer_class = ParentSerializer
现在,当我发送ParentModel
的对象时,我想发送如下内容:{ someModel: { a: 'something', b: 'something else' } }
,而不发送__str__
中定义的内容。
我了解,我可以定义__str__
方法以将其所有字段返回为字符串,然后将大括号也作为字符串放在输出中,但是必须有更好的方法吗?
答案 0 :(得分:0)
由于SomeModel
是抽象模型,因此DRF不允许您为该模型创建序列化器。您可以参考此answer,在其中创建抽象模型的自定义序列化器。
如果SomeModel
类不是抽象的,则需要为SomeModel
类创建一个序列化器,并将其在ParentSerializer
类中用作可写嵌套序列化器。大致而言,您需要实现以下内容:
# serializers.py
class SomeModelSerializer(serializers.ModelSerializer):
class Meta:
model = SomeModel
fields = ('some_fields')
class ParentSerializer(serializers.ModelSerializer):
someModel = SomeModelSerializer()
class Meta:
model = ParentModel
fields = ('someModel')
您可以从here中找到有关可写嵌套序列化程序的更多详细信息。
答案 1 :(得分:0)
尝试如下更改代码
(function(H) {
H.addEvent(H.Series, 'afterRender', function() {
console.log(this);
const chart = this.chart;
chart.series.forEach(series => {
if (series.points && series.points.length) {
series.points.forEach(point => {
if (point.graphic.width > 1) {
if (point.dataLabel.width > point.graphic.width) {
let indic = (
(point.dataLabel.width - point.graphic.width) /
point.dataLabel.width
),
text = point.series.name,
textLen = text.length,
maxTextLen = Math.floor(textLen * (1 - indic)),
newText,
dotted,
substringLen;
dotted = maxTextLen > 2 ? '..' : '.';
substringLen = maxTextLen > 2 ? 2 : 1;
newText = text.substring(0, maxTextLen - substringLen) + dotted;
point.dataLabel.text.element.innerHTML =
'<tspan>' + newText + '</tspan>';
point.dataLabel.text.translate(
(point.dataLabel.width - point.graphic.width) / 2,
0
);
}
}
});
}
})
});
})(Highcharts);