Как я могу превратить объекты Django Model в словарь и все еще иметь свои внешние ключи?

В моем приложении 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 , model.foreignmodel.foreignmodelfield .

Так что это было очень полезно для меня. Это было после того, как я создал кучу пользовательских методов «to-dict» в разных менеджерах классов. Это очень помогло мне. Но вам нужно будет прочитать общие представления и как их настроить, чтобы действительно получить нужные детали.

Матф