1

基本クラス (「myBaseModel」) またはサブクラス (「myDerivedModel」) で定義されているかどうか、フィールド インスタンスから判断することは何とか可能ですか。

または他の方法。モデル インスタンスから継承されていないすべてのフィールドを取得することは可能ですか?

とりあえず、フィールド インスタンスに向かいました。フィールド インスタンスに何らかのメタ情報が関連付けられている可能性があります。

セットアップ:

class myBaseModel(models.Model):
    baseField = models.CharField(max_length=30)

    class Meta:
        abstract = True

class myDerivedModel(myBaseModel):
    subClassField = models.CharField(max_length=30)

アプローチ:

myModel = get_model('my_app_name', 'myDerivedModel')
defaultFields = myModel._meta.get_all_field_names()
for field in defaultFields:
    fieldInstance = myModel._meta.get_field_by_name(field)
    print fieldInstance[0]

これにより、subClassField と baseField が出力されます。subClassField のみを出力する方法を探しています。

django/db/models/options.py から

def get_field_by_name(self, name):
    """
    Returns the (field_object, model, direct, m2m), where field_object is
    the Field instance for the given name, model is the model containing
    this field (None for local fields), direct is True if the field exists
    on this model, and m2m is True for many-to-many relations. When
    'direct' is False, 'field_object' is the corresponding RelatedObject
    for this field (since the field doesn't have an instance associated
    with it).

    Uses a cache internally, so after the first access, this is very fast.
    """
4

1 に答える 1

1
inherited_fields=[]
for base_class in list(myModel .__bases__):
    inherited_fields.extend(base_class._meta.get_all_field_names())
... your code
for field in defaultFields:
    if field not in inherited_fields:
        do_something_with_non_inherited_fields()
于 2012-08-21T13:37:29.773 に答える