【问题标题】:Custom JSONField in DjangoDjango 中的自定义 JSONField
【发布时间】:2016-12-05 00:45:53
【问题描述】:

我正在尝试使用 Django + MySQL 为我的模型实现自定义 JSON 字段。这就是我的 models.py 的样子:

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

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):
        """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)

# 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)

基本上,当保存内容时,我会尝试初始化数据字段。但是,我现在收到此错误:

get_db_prep_save() got an unexpected keyword argument 'connection'

我到底做错了什么?我该如何解决这个问题?任何帮助将不胜感激。

【问题讨论】:

    标签: python mysql json django django-jsonfield


    【解决方案1】:

    根据异常和django docs,您的get_db_prep_save 方法应该再接受一个参数,称为connection,因此:

        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)
    

    应该没问题。

    【讨论】:

    • 现在我得到这个错误:get_db_prep_save() 正好需要 3 个参数(给定 2 个)引用行 return super(JSONField, self).get_db_prep_save(value)。但是,将其更改为返回 super(JSONField, self).get_db_prep_save(value, connection) 会返回一个新错误:INTERFACE ERROR - 错误绑定参数 2 - 可能是不受支持的类型。
    • 您也必须将connection 传递给父函数。
    • 我对你的意思有点困惑。请详细说明好吗?谢谢。
    猜你喜欢
    • 2016-12-05
    • 2021-10-17
    • 2020-10-27
    • 2021-01-15
    • 1970-01-01
    • 2017-04-29
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多