2012-09-12 48 views
30

En mi aplicación Django, ¿cómo puedo convertir objetos de Modelos en un diccionario que incluye las referencias de clave externa del objeto Modelo?¿Cómo puedo convertir los objetos del Modelo Django en un diccionario y todavía tengo sus claves foráneas?

cuando intento esto:

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

El diccionario resultante sólo tiene los campos directos. También me gustaría obtener las claves externas relacionadas con el objeto Modelo. ¿Cómo puedo hacer esto?

+0

_technically_ esa publicación es un duplicado de esta .. –

Respuesta

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

Parece más apropiado para utilizar esta propiedad que aplicar la función model_to_dict, que se debe usar con los formularios. Una ventaja es que el atributo __dict__ no excluye los campos no editables. Una desventaja es que no incluye campos de tipo ManyToManyField (debido a la relación inversa subyacente que supongo). –

+1

representa claves foreghin como user = user_id, quiero el nombre de usuario aquí. ¿cómo hacer eso?/ – Clayton

+0

obtener queryset con seleccionar related? de esta manera: MyModel.objects.select_related ('user__username'). Get (pk = some_integer) – freylis

6

¿Qué tal:

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

Al nombrar explícitamente todos los campos, debe darle los identificadores de clave externa al menos (aunque no lo he comprobado).

Tenga en cuenta que esta función no devuelve los campos con editable=False (ya que está destinado a formularios).

6

Creo que tenía la misma necesidad que usted: quería una representación simple y simple de un objeto. las otras respuestas publicadas (en el momento en que escribo) no me darían eso, y los serializadores, si bien son útiles para su propósito, producen resultados con información adicional que no quiero, y una estructura inconveniente.

Aunque sin duda un corte, esto me está dando un buen kilometraje:

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 

envolviendo el django_model_object en una lista, a continuación, acceder a punto 0 después del análisis se necesita el JSON, ya que, por alguna razón, serializadores sólo pueden serializar iterables de objetos modelo (raro).

Necesitará algunos engranajes adicionales para manejar cualquier tipo de campo de clave externa, puedo publicar de nuevo si termino necesitando escribir eso (¡a menos que alguien más lo edite primero!).

HTH por el momento.

0

Ninguna de las otras respuestas funcionó bastante para mí. Esto, sin embargo, pareció ser el truco.

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} 
0

me imagino que ya ha resuelto este problema para su caso, pero he encontrado algo de información que estaba buscando soluciones similares. Quería poder acceder a objetos y sus campos/atributos en una plantilla. Solo estoy aprendiendo django.

Lo que finalmente realicé fue el 'Generic Display Views', que parece ser capaz de enviar una instancia de objeto o un conjunto de consulta de objetos a una plantilla. Luego puede acceder a los objetos como model.field, o incluso si se trata de un campo de clave externa, model.foreignmodel.foreignmodelfield.

Así que ha sido bastante útil para mí. Esto fue después de que construí un montón de métodos 'to-dict' personalizados en diferentes administradores de clases. Esto me ayudó mucho. Pero tendrá que leer las vistas genéricas y cómo personalizarlas para obtener realmente los detalles que desea.

-Matt

Cuestiones relacionadas