1

我想获取模型中定义的所有非继承字段。也就是说,我想要只在“子模型”中定义的字段,而不是基本(“抽象”)模型。(最终目的:创建一个包含“子模型”中定义的字段的 ModelForm - 动态地,无需写出特定字段)。

通常调用vars(Subclass).keys()只会给你子类的属性,而dir(Subclass)会给你子类及其继承类的属性。我正在尝试使用相同的范例来仅获取 SubModel 中定义的字段:

class Submodel(models.AbstractModel):
    field1=...
    field2=...

class AbstractModel(models.Model):
    fields...
    class Meta:
        abstract=True

但是当我打电话时,vars(Submodel).keys()我得到以下信息(打印):

[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__']

我不确定为什么这会返回子模型中未定义的东西(这似乎与 vars() 的通常行为不一致)。现在我想了更多,一旦我在子模型上定义了方法,它就会返回那些我不希望用于构造 ModelForm 的方法。

我也尝试过Submodel._meta.fieldsSubmodel._meta.many_to_many但那些返回 AbstractModel 和 Submodel 的所有字段。

所以主要问题是:有没有一种好方法可以只获取子模型中定义的字段?

次要问题是:为什么 vars() 这样做?

编辑:

在表单定义中,我想做的是:

class ExampleinheritForm(ModelForm):
    class Meta:
        model = Submodel
        fields = some_function_to_return_only_Submodel_fields()
4

1 回答 1

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 
于 2013-08-28T20:50:04.877 回答