【发布时间】:2013-07-19 12:24:05
【问题描述】:
我正在尝试实现一个自定义 Django 字段,该字段将在 DB 中保留我的模型类之一的名称(例如“Cat”、“Dog”、“Restaurant”、“SuperPrivateCommercialDataPiece”等)并返回请求时的类对象:
class Cat(models.Model):
...
class SomeDataPiece(models.Model):
relatedTo = MyGloriousFieldType(null=True)
...
newPiece = SomeDataPiece()
newPiece.relatedTo = Cat
print newPiece.relatedTo # should print <class 'myproj.myapp.models.Cat'>
我真的做到了。我已经对models.Field 进行了子类化,设置了__metaclass__ 等:
class MyGloriousFieldType(models.Field):
description = "No description, just gloriosity."
__metaclass__ = models.SubfieldBase
def __init__(self, *args, **kwargs):
kwargs['max_length'] = 40
super(BlockTypeField, self).__init__(*args, **kwargs)
def db_type(self, connection):
return 'char(40)'
def to_python(self, value):
if not value:
return None
elif inspect.isclass(value) and issubclass(value, models.Model):
return value
elif hasattr(myproj.myapp.models, value):
return getattr(myproj.myapp.models, value)
else:
raise ValidationError("Invalid model name string")
def get_db_prep_value(self, value, **kwargs):
if inspect.isclass(value) and issubclass(value, models.Model):
return value.__name__
else:
# it is actually never raised
raise ValidationError("Invalid value, Model subclass expected")
def value_to_string(self, instance):
value = self._get_val_from_obj(obj)
return self.get_prep_value(value)
在上面的代码中,它按预期工作。我还在管理员中注册了一些包含此类字段的模型,现在我什至可以创建此类对象;为 MyGloriousFieldType 字段创建文本输入。
当我尝试使用 MyGloriousFieldType 字段编辑已经存在的对象时,危机就开始了。首先,它用“Cat object”而不是“Cat”填充文本字段。其次,当我把它改回“Cat”并点击“save changes”时会报错:
TypeError at /admin/myapp/somedatapiece/3/
unbound method prepare_database_save() must be
called with Cat instance as first argument (got
MyGloriousFieldType instance instead)
那么,我做错了什么?
【问题讨论】:
标签: django django-admin django-custom-field