2

models.py:

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=100, unique=True)
    body = models.TextField()

Pythonのクラスで関数を呼び出すと、dir通常、クラス変数が定義されている場合はそれを含むリストが表示されます。しかし、奇妙なことに、私が次のことを行って行うpython manage.py shellと、次のようになります。

>>> import blog.models as bm
>>> dir(bm.Blog)
['DoesNotExist', 'MultipleObjectsReturned', '__class__', '__delattr__', '__dict__', 
'__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', 
'__metaclass__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', 
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__unicode__', 
'__weakref__', '_base_manager', '_default_manager', '_deferred', '_get_FIELD_display', 
'_get_next_or_previous_by_FIELD', '_get_next_or_previous_in_order', '_get_pk_val', 
'_get_unique_checks', '_meta', '_perform_date_checks', '_perform_unique_checks', 
'_set_pk_val', 'clean', 'clean_fields', 'date_error_message', 'delete', 'full_clean', 
'objects', 'pk', 'prepare_database_save', 'save', 'save_base', 'serializable_value', 
'unique_error_message', 'validate_unique']

dir(bm.Blog)titleおよびbodyクラス変数が含まれていません(予期しない)。dir(bm.Blog())ただし、これらのクラス変数は含まれています(予想)。

>>> dir(bm.Blog())
['DoesNotExist', 'MultipleObjectsReturned', '__class__', '__delattr__', '__dict__', 
'__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', 
'__metaclass__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', 
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__unicode__', 
'__weakref__', '_base_manager', '_default_manager', '_deferred', '_get_FIELD_display', 
'_get_next_or_previous_by_FIELD', '_get_next_or_previous_in_order', '_get_pk_val', 
'_get_unique_checks', '_meta', '_perform_date_checks', '_perform_unique_checks', 
'_set_pk_val', '_state', 'body', 'clean', 'clean_fields', 'date_error_message', 
'delete', 'full_clean', 'id', 'objects', 'pk', 'prepare_database_save', 'save', 
'save_base', 'serializable_value', 'title', 'unique_error_message', 'validate_unique']

Modelでは、Djangoサブクラスでdir関数を呼び出すと、そのクラス変数が表示されないのはなぜですか?

4

1 に答える 1

3

db.Modelこれは、特定のメタクラスを持つから継承したために発生しますModelBase。したがって、他のフィールド(テーブルの行に関するメタ情報を提供する)は、model-instanceのこのフィールドのtitle=models.CharFieldではなく、model-classの実際の属性ではありません。しかし、あなたはそれらにアクセスすることができます:

Blog._meta.get_field('title') # models.CharField instance
于 2012-10-08T23:21:47.790 に答える