__str__返回非字符串(类型列表)

时间:2018-03-08 12:19:12

标签: json django django-models django-views

我有一个django应用程序,我在其中存储json变量。我已经通过admin存储了json变量,我正在尝试在shell中打印它。我的主要目的是将此变量传递给具有ajax方法的网页。但是当我第一次尝试在shell中打印时,我得到了这个错误

__str__ returned non-string (type list)

我的models.py是这种形式

from django.db import models
from django.utils import timezone
from jsonfield import JSONField


# Create your models here.


class newgrid(models.Model):
    data = JSONField()
    def __str__(self):
        return self.data

我的JSON变量属于这种形式

[{"col":1,"row":1,"size_x":1,"size_y":1},{"col":2,"row":1,"size_x":1,"size_y":1},{"col":3,"row":1,"size_x":1,"size_y":1},{"col":4,"row":1,"size_x":1,"size_y":1},{"col":1,"row":2,"size_x":1,"size_y":1},{"col":2,"row":2,"size_x":1,"size_y":1},{"col":3,"row":2,"size_x":1,"size_y":1},{"col":4,"row":2,"size_x":1,"size_y":1},{"col":1,"row":3,"size_x":1,"size_y":1},{"col":2,"row":3,"size_x":1,"size_y":1},{"col":3,"row":3,"size_x":1,"size_y":1},{"col":4,"row":3,"size_x":1,"size_y":1},{"col":5,"row":1,"size_x":1,"size_y":1}]

在shell中我运行了以下命令

from testforweb.models import newgrid
newgrid.objects.all()

它最初返回此

<QuerySet [<newgrid: newgrid object (1)>]>

但后来我添加了

 def __str__(self):
        return self.data

只是为了看到实际的JSON变量。但是我收到了错误 如何查看我通过admin coz插入的实际JSON变量我需要将其发送到网页,因为它是

修改1

My updated models.py
from django.db import models
from django.utils import timezone
from jsonfield import JSONField
import simplejson as json

# Create your models here.


    class newgrid(models.Model):
        data = JSONField()
        def __str__(self):
            json.dumps(self.data)

3 个答案:

答案 0 :(得分:2)

__str__函数必须返回字符串:

    def __str__(self):
        return json.dumps(self.data)

答案 1 :(得分:1)

JSON字段实际上将JSON解码为本机python类型(列表和字典)。

__str___方法总是需要返回一个字符串。 如果你想要json的字符串表示,你应该使用json.dumps(self.data)或类似的序列化数据字段作为__str__的返回值。

答案 2 :(得分:1)

使用

 handlerCopy(e) {
    console.log(e.target.innerHTML);
    e.preventDefault();
    e.nativeEvent.stopImmediatePropagation();

    this.setState(prevState => ({
      counter: prevState.counter + 1
    }));

    alert('Don\'t copy it!');
  }

而不是

   def __str__(self):
        return '%s' % (self.data)