我想获得模型中定义的所有非继承字段。也就是说,我希望仅在“子模型”中定义的字段,而不是基本(“抽象”)模型。 (最终目的:创建一个仅包含“子模型”中定义的字段的ModelForm - 动态,无需写出特定字段)。
通常调用vars(Subclass).keys()
将只提供Subclass的属性,而dir(Subclass)
将为您提供SubClass及其继承类的属性。我正在尝试使用相同的范例来仅获取SubModel中定义的字段:
class Submodel(models.AbstractModel):
field1=...
field2=...
class AbstractModel(models.Model):
fields...
class Meta:
abstract=True
但是当我打电话给vars(Submodel).keys()
时,我得到以下内容(pprinted):
[u'__module__',
'_meta',
'MultipleObjectsReturned',
'get_next_by_submission_datetime',
'get_next_by_some_date_and_time',
'_base_manager',
'objects',
'_default_manager',
'get_previous_by_submission_datetime',
'the_foreignkey_field_in_abstractmodel',
'get_previous_by_some_date_and_time',
'DoesNotExist',
'__doc__',
'__unicode__']
我不确定为什么这会返回Submodel中未定义的东西(这似乎与vars()的通常行为不一致)。现在,我想更多关于它,一旦我在Submodel上定义方法,它将返回那些我不想构建ModelForm的方法。
我还尝试了Submodel._meta.fields
和Submodel._meta.many_to_many
,但这些都会返回AbstractModel和Submodel的所有字段。
所以主要问题是:是否有一种很好的方法只能获得子模型中定义的字段?
小问题是:为什么vars()这样做?
编辑:
在表单定义中,我想要做的是:
class ExampleinheritForm(ModelForm):
class Meta:
model = Submodel
fields = some_function_to_return_only_Submodel_fields()
答案 0 :(得分:0)
这就是我最终做的事情 - 到目前为止对我来说非常棒。
@classmethod
def get_userdefined_formfields(cls):
"""Takes all the model fields on a concrete model,
and subtracts out the ones in the parent (abstract) model."""
allfields = cls._meta.fields + cls._meta.many_to_many
#this assumes we only inherit from one abstract model
#could be modified if that were not the case
parentfields = AbstractModel._meta.fields + AbstractModel._meta.many_to_many
#filter out parent fields
childfields = [f for f in allfields if f not in parentfields]
#filter out auto fields and fields without help text, return names
return childfields