2011-08-08 11 views
6

Lo que necesito: Quiero obtener los detalles del objeto de DB. Yo uso la función get(). El problema que tengo es que hago en en una función, y uno de los argumentos es el nombre del campo como cadena:django - obtener el campo cuyo nombre es dinámico

def delete_file_if_changed(id, change, form, model, field_name='image'): 
    if change: 
     if field_name in form.changed_data: 
      old_image = model.objects.get(pk__exact=id) 

Ahora - ¿Cómo puedo hacer lo que puedo conseguir old_image.field_name - cómo ¿Haz eso?

Respuesta

17

¿Sabía que esta fue su respuesta al principio? Le permite buscar por una propiedad dinámica: ¿Podría funcionar el operador **?

kw = {field_name:change} # you're not explicit as to which is the field_name 
         # value you would like to search for. 
old_image = model.objects.get(**kw) 

Pero, si ya tiene el objeto que desee, y sólo tiene que obtener el valor de una propiedad dinámica llamada, entonces se puede utilizar getattr(object, name[, default]):

getattr(old_image, "id", "Spam") # gets old_image.id, if that does not exist, it 
           # defaults to the str "Spam" Of course, in this 
           # context, you probably want 
           # getattr(old_image, field_name) 
+0

Eso es lo que he estado de searchung . Gracias. – robos85

0

¿Qué hay de getattr(old_image, field_name)? Más información en documentation.

1

Si sólo desea que el valor del campo, evitar todo el proceso de construcción de la instancia de modelo y conseguir el valor, simplemente consultar directamente desde la base de datos:

field_value = model.objects.values_list(field_name, flat=True).get(pk__exact=id) 
Cuestiones relacionadas