Подтвердить что ты не робот

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

В моем приложении Django, как я могу превращать объекты из моделей в словарь, который включает ссылки внешнего ключа объекта Model?

Когда я попробую это:

from django.forms.models import model_to_dict
model_to_dict(instance, fields=[], exclude=[])

Результирующий словарь содержит только прямые поля. Я также хотел бы получить внешние ключи, связанные с объектом Model. Как я могу это сделать?

4b9b3361

Ответ 1

obj = get_object_or_404(CustomModel,id=some_id)
my_dict = obj.__dict__

Ответ 2

Как насчет:

model_to_dict(instance, fields=[field.name for field in instance._meta.fields])

Явным образом называя все поля, он должен предоставить вам идентификаторы внешнего ключа по крайней мере (хотя я еще не проверял).

Обратите внимание, что эта функция не возвращает поля с editable=False (поскольку она предназначена для форм).

Ответ 3

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

Хотя, по общему признанию, взлом, это дает мне хороший пробег:

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 на данный момент.

Ответ 4

Возможно, вы захотите посмотреть сериализацию Django, если хотите работать со связанными моделями.

Ответ 5

Ни один из других ответов не сработал у меня. Это, однако, казалось, делало трюк.

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}

Ответ 6

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

То, что я наконец прочитал, было 'Общие представления просмотров, которые, похоже, могут отправлять экземпляр объекта или набор запросов объектов по шаблону. Затем вы можете получить доступ к таким объектам, как model.field, или даже если это поле для внешнего ключа, model.foreignmodel.foreignmodelfield.

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

Матф