Как получить свойства поля модели Django?

предоположим, мы пишем юниттесты и хотим проверять свойства поля. Пусть имеется модель:
class Knowledge(models.Model):
    name = models.CharField(max_length=256,
                            verbose_name='Тема',
                            unique=True
                            )
    category = models.ForeignKey(Category,
                           on_delete=models.PROTECT,
                           verbose_name='Категория знания'
                           )
Мы можем проверить, например, что verbose_name поля category равно 'Категория знания':
    def test_category_verbose_name(self):
        obj = Knowledge.objects.get(id=1)
        tested_property = obj._meta.get_field('category').verbose_name
        self.assertEquals(tested_property, 'Категория знания')
Кроме тех свойств, которые указаны непосредственно в описании модели, есть еще масса доступных для проверки. Например, свойство 'is_relation', которое имеет значение True, если поле является отношением, т.е. это FK, M2M, O2O. Также полезным для проверки является свойство related_model, в котором хранится модель, с которой построены отношения.

Список свойств зависит от типа поля (у models.Charfield 137 свойств, у models.ForeignKey 181 свойство). Свойства поля можно получить, например, в питоновском шелле, если уже создан хотя бы один экземпляр модели. Запускаем
./manage.py shell
импортим модель и выводим свойства поля
from <your app>.models import Knowledge
z = Knowledge.objects.get(id=1)
pprint.pprint(dir(z._meta.get_field('category')), indent=4)
Вот список свойств FK:
[   '__class__',
    '__copy__',
    '__deepcopy__',
    '__delattr__',
    '__dict__',
    '__dir__',
    '__doc__',
    '__eq__',
    '__format__',
    '__ge__',
    '__getattribute__',
    '__gt__',
    '__hash__',
    '__init__',
    '__init_subclass__',
    '__le__',
    '__lt__',
    '__module__',
    '__ne__',
    '__new__',
    '__reduce__',
    '__reduce_ex__',
    '__repr__',
    '__setattr__',
    '__sizeof__',
    '__str__',
    '__subclasshook__',
    '__weakref__',
    '_check_backend_specific_checks',
    '_check_choices',
    '_check_clashes',
    '_check_db_index',
    '_check_deprecation_details',
    '_check_field_name',
    '_check_null_allowed_for_primary_keys',
    '_check_on_delete',
    '_check_referencing_to_swapped_model',
    '_check_related_name_is_valid',
    '_check_related_query_name_is_valid',
    '_check_relation_model_exists',
    '_check_to_fields_exist',
    '_check_unique',
    '_check_unique_target',
    '_check_validators',
    '_choices_is_value',
    '_clear_cached_lookups',
    '_db_tablespace',
    '_description',
    '_error_messages',
    '_get_default',
    '_get_flatchoices',
    '_get_lookup',
    '_unique',
    '_unregister_lookup',
    '_validators',
    '_verbose_name',
    'attname',
    'auto_created',
    'auto_creation_counter',
    'blank',
    'cached_col',
    'cast_db_type',
    'check',
    'choices',
    'class_lookups',
    'clean',
    'clone',
    'column',
    'concrete',
    'contribute_to_class',
    'contribute_to_related_class',
    'convert_empty_strings',
    'creation_counter',
    'db_check',
    'db_column',
    'db_constraint',
    'db_index',
    'db_parameters',
    'db_returning',
    'db_tablespace',
    'db_type',
    'db_type_parameters',
    'db_type_suffix',
    'deconstruct',
    'default',
    'default_error_messages',
    'default_validators',
    'delete_cached_value',
    'description',
    'descriptor_class',
    'do_related_class',
    'editable',
    'empty_strings_allowed',
    'empty_values',
    'error_messages',
    'flatchoices',
    'foreign_related_fields',
    'formfield',
    'forward_related_accessor_class',
    'from_fields',
    'get_attname',
    'get_attname_column',
    'get_cache_name',
    'get_cached_value',
    'get_choices',
    'get_col',
    'get_db_converters',
    'get_db_prep_save',
    'get_db_prep_value',
    'get_default',
    'get_extra_descriptor_filter',
    'get_extra_restriction',
    'get_filter_kwargs_for_object',
    'get_foreign_related_value',
    'get_forward_related_filter',
    'get_instance_value_for_fields',
    'get_internal_type',
    'get_joining_columns',
    'get_limit_choices_to',
    'get_local_related_value',
    'get_lookup',
    'get_lookups',
    'get_path_info',
    'get_pk_value_on_save',
    'get_prep_value',
    'get_reverse_joining_columns',
    'get_reverse_path_info',
    'get_reverse_related_filter',
    'get_transform',
    'has_default',
    'help_text',
    'hidden',
    'is_cached',
    'is_relation',
    'local_related_fields',
    'many_to_many',
    'many_to_one',
    'max_length',
    'merge_dicts',
    'model',
    'name',
    'null',
    'one_to_many',
    'one_to_one',
    'opts',
    'pre_save',
    'primary_key',
    'register_lookup',
    'rel_class',
    'rel_db_type',
    'related_accessor_class',
    'related_fields',
    'related_model',
    'related_query_name',
    'remote_field',
    'requires_unique_target',
    'resolve_related_fields',
    'reverse_related_fields',
    'run_validators',
    'save_form_data',
    'select_format',
    'serialize',
    'set_attributes_from_name',
    'set_attributes_from_rel',
    'set_cached_value',
    'swappable',
    'swappable_setting',
    'system_check_deprecated_details',
    'system_check_removed_details',
    'target_field',
    'to_fields',
    'to_python',
    'unique',
    'unique_for_date',
    'unique_for_month',
    'unique_for_year',
    'validate',
    'validators',
    'value_from_object',
    'value_to_string',
    'verbose_name']