【发布时间】:2011-07-28 07:27:17
【问题描述】:
我有两个自定义 Django 字段,一个 JSONField 和一个 CompressedField,它们都运行良好。我也想有一个CompressedJSONField,我更希望我能做到这一点:
class CompressedJSONField(JSONField, CompressedField):
pass
但在导入时我得到:
RuntimeError: maximum recursion depth exceeded while calling a Python object
我可以找到有关在 Django 中使用具有多重继承的模型的信息,但没有关于对字段执行相同操作的信息。这应该可能吗?还是应该在这个阶段就放弃?
编辑:
为了清楚起见,我不认为这与我的代码的细节有任何关系,因为以下代码具有完全相同的问题:
class CustomField(models.TextField, models.CharField):
pass
编辑 2:
我目前使用的是 Python 2.6.6 和 Django 1.3。这是我的剥离右下测试示例的完整代码:
customfields.py
from django.db import models
class CompressedField(models.TextField):
""" Standard TextField with automatic compression/decompression. """
__metaclass__ = models.SubfieldBase
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. """
__metaclass__ = models.SubfieldBase
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):
pass
models.py
from django.db import models
from customfields import CompressedField, JSONField, CompressedJSONField
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
我一添加compressed_json_field = CompressedJSONField() 行,就会在初始化 Django 时出错。
【问题讨论】:
-
除非您发布
JSONField和CompressedField的代码,否则无法判断发生了什么 -
@pajton:我认为该代码无关紧要——请参阅我的编辑。 (不过,如果你真的想看,我很乐意发布它:))
-
嗯,有趣...我不知道为什么会这样
-
是“传递”给你错误的实际代码吗?自定义字段保存和导入到哪里?
-
@kriegar -- 是的,有问题的代码就像我展示的那样简单。对不起,但我想我不明白你的另一个问题。该代码位于一个单独的模块中,并在我的
models.py顶部使用from custom_field import CustomField调用,如果这就是您的意思...
标签: python django multiple-inheritance custom-fields