2016-07-30 38 views
0

我想爲我的模型使用Django + MySQL實現自定義JSON字段。這就是我的models.py樣子:在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) 

基本上,在保存內容,我想初始化數據字段。但是,我現在得到這個錯誤:

get_db_prep_save() got an unexpected keyword argument 'connection' 

我究竟在做什麼錯?我該如何解決這個問題?任何幫助,將不勝感激。

回答

0

根據異常和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) 

應該沒問題。

+0

現在我得到這個錯誤:get_db_prep_save()需要恰好3個參數(2給出)引用線返回超級(JSONField,self).get_db_prep_save(值)。但是,將其更改爲返回超級(JSONField,self).get_db_prep_save(value,connection)將返回一個新錯誤:INTERFACE ERROR - 錯誤綁定參數2 - 可能不支持的類型。 –

+1

您也必須將'connection'傳遞給父函數。 –

+0

我對你的意思有點困惑。請你詳細說明一下嗎?謝謝。 –