Как получить поля объекта? - PullRequest
7 голосов
/ 21 марта 2011

Я делаю функцию для преобразования объекта модели в словарь (и все foreignkeys в несколько словарей, рекурсивно).Я узнал от друга, что могу получить поля модели, посмотрев на obj._meta.fields, но нигде не могу найти документацию по этому вопросу.

Как мне получить поля модели?Как я могу интерпретировать то, что можно найти в _meta классе?

Ответы [ 2 ]

9 голосов
/ 21 марта 2011

Это показалось довольно интересным, поэтому я просмотрел исходный код django.forms и специально искал реализацию ModelForm.Я подумал, что ModelForm будет достаточно хорош для самоанализа данного экземпляра, и так уж получилось, что есть удобная функция, которая может помочь вам на вашем пути.

>>> from django.forms.models import model_to_dict
>>> from django.contrib.auth.models import Group
>>> g = Group.objects.filter()[0]
>>> d = model_to_dict(g)
>>> d
{'permissions': [40, 41, 42, 46, 47, 48, 50, 43, 44, 45, 31, 32, 33, 34, 35, 36, 37, 38, 39], 'id': 1, 'name': u'Managers'}
>>> 

Понятно, атрибут _metaнедокументировано, потому что является внутренней деталью реализации.Я не вижу, чтобы это изменилось в ближайшее время, поэтому, вероятно, это относительно безопасно для использования.Вы, вероятно, можете использовать функцию model_to_dict, описанную выше, для начала того, что вы хотите делать.Там не должно быть много изменений.Остерегайтесь обратных отношений, если вы планируете рекурсивное включение моделей.

Возможно, вы захотите исследовать и другой путь.django-piston - это среда RESTful, которая объявляет несколько emitters, которые могут быть вам полезны, в частности, метод BaseEmitter.construct().Вы должны быть в состоянии легко определить DictionaryEmitter, который вы используете для целей, отличных от сериализации RESTful.

4 голосов
/ 21 марта 2011

На нем есть несколько документов , но в основном мы склонны находить применение для функций django, которые используются внутри, например, _meta.fields или _meta.get_all_field_names(), _meta.get_field_by_name.

Для меня их лучше всего обнаружить через iPython и завершение табуляции. Или источник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...