Ответ 1
obj = get_object_or_404(CustomModel,id=some_id)
my_dict = obj.__dict__
В моем приложении Django, как я могу превращать объекты из моделей в словарь, который включает ссылки внешнего ключа объекта Model?
Когда я попробую это:
from django.forms.models import model_to_dict
model_to_dict(instance, fields=[], exclude=[])
Результирующий словарь содержит только прямые поля. Я также хотел бы получить внешние ключи, связанные с объектом Model. Как я могу это сделать?
obj = get_object_or_404(CustomModel,id=some_id)
my_dict = obj.__dict__
Как насчет:
model_to_dict(instance, fields=[field.name for field in instance._meta.fields])
Явным образом называя все поля, он должен предоставить вам идентификаторы внешнего ключа по крайней мере (хотя я еще не проверял).
Обратите внимание, что эта функция не возвращает поля с editable=False
(поскольку она предназначена для форм).
Я думаю, что у меня была такая же потребность, как и вы - я хотел простое и простое представление объекта. другие ответы, опубликованные (в то время, когда я пишу), не дали бы мне этого, и сериализаторы, хотя и полезны для своей цели, производят вывод с дополнительной информацией, которую я не хочу, и неудобную структуру.
Хотя, по общему признанию, взлом, это дает мне хороший пробег:
from django.core import serializers
def obj_to_dict(model_instance):
serial_obj = serializers.serialize('json', [model_instance])
obj_as_dict = json.loads(serial_obj)[0]['fields']
obj_as_dict['pk'] = model_instance.pk
return obj_as_dict
обертывание django_model_object в список, тогда доступ к элементу 0 после разбора json необходим, потому что по какой-то причине сериализаторы могут сериализовать только итерации объектов модели (странно).
Вам понадобится дополнительная передача для обработки любых полей внешнего ключа, я могу отправить сообщение, если мне в итоге нужно написать это (если кто-то еще не редактирует его первым!).
HTH на данный момент.
Возможно, вы захотите посмотреть сериализацию Django, если хотите работать со связанными моделями.
Ни один из других ответов не сработал у меня. Это, однако, казалось, делало трюк.
def model_to_dict(instance, include=None, exclude=None):
fields = instance._meta.concrete_fields
if include is not None:
return {f.attname: getattr(instance, f.attname) for f in fields if f.name in include}
if exclude is not None:
return {f.attname: getattr(instance, f.attname) for f in fields if f.name not in exclude}
return {f.attname: getattr(instance, f.attname) for f in fields}
Я предполагаю, что вы уже решили эту проблему для своего случая, но я нашел некоторую информацию, когда искал подобные решения. Я хотел иметь доступ к объектам и их полям/атрибутам в шаблоне. Я просто изучаю джанго.
То, что я наконец прочитал, было 'Общие представления просмотров, которые, похоже, могут отправлять экземпляр объекта или набор запросов объектов по шаблону. Затем вы можете получить доступ к таким объектам, как model.field
, или даже если это поле для внешнего ключа, model.foreignmodel.foreignmodelfield
.
Так что это было очень полезно для меня. Это было после того, как я создал кучу пользовательских методов "to-dict" в разных менеджерах классов. Это очень помогло мне. Но вам нужно будет прочитать общие представления и как их настроить, чтобы действительно получить нужные детали.
Матф