python - foraneas - clave primaria en django
¿Cómo puedo convertir los objetos del Modelo Django en un diccionario y todavía tengo sus claves foráneas? (6)
Esta pregunta ya tiene una respuesta aquí:
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?
Cuando intento esto:
from django.forms.models import model_to_dict
model_to_dict(instance, fields=[], exclude=[])
El diccionario resultante solo tiene los campos directos. También me gustaría obtener las claves externas relacionadas con el objeto Modelo. ¿Cómo puedo hacer esto?
Creo que tenía la misma necesidad que tú: 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 es cierto que es un truco, esto me está dando un buen rendimiento:
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, luego accediendo al ítem 0 después de analizar el json es necesario porque, por alguna razón, los serializadores solo pueden serializar los iterables de los objetos del modelo (extraños).
Necesitaría 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 ahora.
Es posible que desee consultar la serialización de Django si desea trabajar con modelos relacionados.
Me imagino que ya resolvió este problema para su caso, pero encontré información cuando buscaba soluciones similares. Quería poder acceder a objetos y sus campos / atributos en una plantilla. Solo estoy aprendiendo django.
Lo que finalmente leí fue sobre las "Vistas de visualización genéricas" , que parecen ser capaces de enviar una instancia de objeto o un conjunto de consulta de objetos a una plantilla. Luego puede acceder a los objetos como el campo model.field
, o incluso si se trata de un campo de model.foreignmodel.foreignmodelfield
, 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.
-Mate
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}
Qué tal si:
model_to_dict(instance, fields=[field.name for field in instance._meta.fields])
Al nombrar explícitamente todos los campos, al menos debería proporcionar los ID de la clave externa (aunque no he verificado).
Tenga en cuenta que esta función no devuelve campos con editable=False
(ya que está destinado a formularios).
obj = get_object_or_404(CustomModel,id=some_id)
my_dict = obj.__dict__