1

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/ の InterfaceError

パラメータ 2 のバインディング エラー - おそらくサポートされていない型です。

私は正確に何を間違っていますか?エラーはどういう意味ですか。エラーがあるかどうかさえわからないかのように、「おそらく」と言っています。何か助けはありますか?

完全なトレースバックが必要な場合は、ここで見つけることができます: http://pastebin.com/B15hZpbu

4

1 に答える 1