【问题标题】:Get only the non-inherited fields for a Django mixin仅获取 Django mixin 的非继承字段
【发布时间】:2013-06-13 15:02:58
【问题描述】:

我想获取模型中定义的所有非继承字段。也就是说,我想要只在“子模型”中定义的字段,而不是基本(“抽象”)模型。 (最终目的:创建一个包含“子模型”中定义的字段的 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()

【问题讨论】:

    标签: python django mixins


    【解决方案1】:

    这就是我最终所做的 - 到目前为止对我来说效果很好。

    @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 
    

    【讨论】:

      猜你喜欢
      • 2017-11-25
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      相关资源
      最近更新 更多