2016-07-30 10 views
0

Django + MySQLを使用しているモデル用のカスタムJSONフィールドを実装しようとしています。DjangoのカスタムJSONField

コンテンツは、私がデータフィールドを初期化しようとしています、保存されている基本的
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) 

、:これは私のmodels.pyがどのように見えるかです。ただし、今すぐこのエラーが発生します。

get_db_prep_save() got an unexpected keyword argument 'connection' 

正確に間違っていますか?そして私はこれをどのように修正できますか?どんな助けもありがとう。

答えて

0

例外とdjango docsによると、あなたのget_db_prep_saveconnectionと呼ばれる1つの以上の引数を取るべき方法、これは:

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) 

大丈夫でなければなりません。

+0

ここで、get_db_prep_save()は、3つの引数(2つが指定されています)を返します。この行を参照すると、スーパー(JSONField、self).get_db_prep_save(value)が返されます。ただし、これを変更してsuper(JSONField、self).get_db_prep_save(value、connection)を返すと、新しいエラーが返されます。INTERFACE ERROR - エラーバインディングパラメータ2 - おそらくサポートされていない型です。 –

+1

親関数にも 'connection'を渡す必要があります。 –

+0

私はあなたが何を意味するのか少し混乱しています。あなたは詳しく教えますか?ありがとう。 –

関連する問題