<p>在做了一些快速测试后,我发现如果从JSON和compressed字段中删除<strong>元类</strong>,并将其放入它编译的compressedJSON字段中。如果您需要JSON或压缩字段,那么将它们子类化并jusst添加<code>__metaclass__ = models.SubfieldBase</code></p>
<p>我承认我没必要这么做:</p>
<pre><code>from django.db import models
class CompressedField(models.TextField):
""" Standard TextField with automatic compression/decompression. """
description = 'Field which compresses stored data.'
def to_python(self, value):
return value
def get_db_prep_value(self, value, **kwargs):
return super(CompressedField, self).get_db_prep_value(value, prepared=True)
class JSONField(models.TextField):
""" JSONField with automatic serialization/deserialization. """
description = 'Field which stores a JSON object'
def to_python(self, value):
return value
def get_db_prep_save(self, value, **kwargs):
return super(JSONField, self).get_db_prep_save(value, **kwargs)
class CompressedJSONField(JSONField, CompressedField):
__metaclass__ = models.SubfieldBase
class TestModel(models.Model):
name = models.CharField(max_length=150)
#compressed_field = CompressedField()
#json_field = JSONField()
compressed_json_field = CompressedJSONField()
def __unicode__(self):
return self.name
</code></pre>
<p>如果您想分别使用JSON和Commpressed字段,我想这个想法是可行的:</p>
^{pr2}$
<p>老实说。。。我真的不明白这些。在</p>
<p><strong>编辑基本方法破解</strong></p>
<pre><code>class CompressedJSONField(JSONField, CompressedField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
value = JSONField.to_python(self, value)
value = CompressedField.to_python(self, value)
return value
</code></pre>
<p>另一种方法是使类上的to_python()具有唯一的名称,并在继承的类中调用它们to_python()方法</p>
<p>或者看看这个<a href="https://stackoverflow.com/questions/2611892/get-python-class-parents/2611897#2611897">answer</a></p>
<p><strong>编辑</strong>
在阅读了一些之后,如果您在第一个基中实现了对<code>super(class, self).method(args)</code>的调用,那么它将调用第二个基。如果你坚持使用,那么你就不会有任何问题。<a href="http://docs.python.org/library/functions.html#super" rel="nofollow noreferrer">http://docs.python.org/library/functions.html#super</a>值得一看,<a href="http://www.artima.com/weblogs/viewpost.jsp?thread=237121" rel="nofollow noreferrer">http://www.artima.com/weblogs/viewpost.jsp?thread=237121</a></p>
<pre><code>class base1(object):
def name(self, value):
print "base1", value
super(base1, self).name(value)
def to_python(self, value):
value = value + " base 1 "
if(hasattr(super(base1, self), "to_python")):
value = super(base1, self).to_python(value)
return value
class base2(object):
def name(self, value):
print "base2", value
def to_python(self, value):
value = value + " base 2 "
if(hasattr(super(base2, self), "to_python")):
value = super(base2, self).to_python(value)
return value
class superClass(base1, base2):
def name(self, value):
super(superClass, self).name(value)
print "super Class", value
</code></pre>