返回文字JSON而不是__str__ Django Rest Framework

时间:2019-07-09 09:39:55

标签: model django-rest-framework

每当我在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__方法以将其所有字段返回为字符串,然后将大括号也作为字符串放在输出中,但是必须有更好的方法吗?

2 个答案:

答案 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);