1

モデルで定義されている継承されていないフィールドをすべて取得したいと考えています。つまり、ベース (「抽象」) モデルではなく、「サブモデル」でのみ定義されたフィールドが必要です。(最終的な目的: 「サブモデル」で定義されたフィールドのみを含むModelForm を動的に作成し、特定のフィールドを書き出す必要はありません)。

通常、呼び出しvars(Subclass).keys()はサブクラスの属性のみを提供し、サブクラスdir(Subclass)とその継承されたクラスの両方の属性を提供します。同じパラダイムを使用して、サブモデルで定義されたフィールドのみを取得しようとしています:

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.fieldsましSubmodel._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 に答える