【问题标题】:InterfaceError for a custom JSONField for Django用于 Django 的自定义 JSONField 的 InterfaceError
【发布时间】:2016-12-05 02:16:40
【问题描述】:

我正在尝试为支持 MySQL 的 Django 项目构建自定义 JSON 字段。这是我的模型

from __future__ import unicode_literals
from django.db import models
from django.db import models
from django.core.serializers.json import DjangoJSONEncoder
import json

name1 = 'name1'
name2 = 'name2'

class JSONField(models.TextField):
    """JSONField is a generic textfield that neatly serializes/unserializes
    JSON objects seamlessly"""

    # Used so to_python() is called
    __metaclass__ = models.SubfieldBase

    def to_python(self, value):
        """Convert our string value to JSON after we load it from the DB"""

        if value == "":
            return None

        try:
            if isinstance(value, basestring):
                return json.loads(value)
        except ValueError:
            pass

        return value

    def get_db_prep_save(self, value, connection):
        """Convert our JSON object to a string before we save"""

        if value == "":
            return None

        if isinstance(value, dict):
            value = json.dumps(value, cls=DjangoJSONEncoder)

        return super(JSONField, self).get_db_prep_save(value, connection)

# Articles / Content
class Content(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()
    data = JSONField(blank=True, null=True)

    def __unicode__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.data = {
            name1 : {
                "image_url" : 'https://photosite.com/image1.jpg',
                "views" : 0
            },
            name2 : {
                 "image_url" : 'https://photosite.com/image2.jpg',
                 "views" : 0
            }
        }
        super(Content, self).save(*args, **kwargs)

请注意内容模型的自定义保存方法。当我尝试保存新的 Content 对象时,出现此错误:

/admin/myapp/content/add/处的接口错误

错误绑定参数 2 - 可能是不受支持的类型。

我到底做错了什么?错误甚至意味着什么。我的意思是它说“可能”,好像它甚至不确定是否有错误。有什么帮助吗?

如果你想要完整的回溯,你可以在这里找到它: http://pastebin.com/B15hZpbu

【问题讨论】:

  • 您知道已经有几个自定义 JSON 包可用了吗?虽然你说 mysql 支持你的堆栈跟踪显示 sqlite??
  • 我的意思是我将在生产中使用 MySQL。现在,代码在 dev 中。很抱歉造成混乱。
  • 这个错误不是 django 产生的。它来自较低层,可能是 sqlite3 驱动程序。为什么不在调用超类方法保存之前记录所有字段并用它更新问题。
  • 您能否详细说明一下,因为我有点困惑。谢谢。
  • 有一个类似的问题,并意识到这是因为我使用 sqlite 进行开发,但 JSONFieldpostgresql 特定的。现在使用 postgres docker 容器进行开发。

标签: python json django django-models django-jsonfield


【解决方案1】:

在您调用用户方法之前,此代码将产生未定义变量错误。

data = {
        name1 : {
            "image_url" : 'https://photosite.com/image1.jpg',
            "views" : 0
        },
        name2 : {
             "image_url" : 'https://photosite.com/image2.jpg',
             "views" : 0
        }
    }

name1 和 name2 显然没有在您的代码中定义。

【讨论】:

    猜你喜欢
    • 2016-12-05
    • 2020-10-27
    • 2021-10-17
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 2017-09-08
    • 2017-04-29
    相关资源
    最近更新 更多