2010-12-02 10 views
14

Lo que dice en la lata. ¿Hay alguna manera de hacer un modelo de Django de solo lectura?¿Hace un modelo de Django de solo lectura?

Con esto quiero decir un modelo de Django en el que una vez que se han creado los registros, no se pueden editar.

Esto sería útil para un modelo que registra el historial de transacciones.

Respuesta

10

Puede reemplazar el modelo de guardar el método y comprobar si se trata de una entidad existente, en cuyo caso no guardar los cambios:

def save(self, *args, **kwargs): 
    if self.id is None: 
     super(ModelName, self).save(*args, **kwargs) 

Así que en este ejemplo solamente guardar los cambios cuando la entidad tiene Aún no se obtuvo un id, que es solo el caso cuando se trata de una nueva entidad que aún no se ha insertado.

+0

Incorrecto. Las identificaciones que no son '' Nonas' que no existen en la tabla también serán registros nuevos. –

+0

@Ignacio: Creo que tienes razón. Alguien puede establecer la propiedad id antes de guardar la entidad, en cuyo caso id no es ninguno. –

+0

@tomload: necesitaría verificar si ya existe un artículo con esa identificación ... –

3

Puede anular el método de guardar y no llamar al súper si así lo desea. Esa sería una manera bastante fácil de lograr esto.

# blatantly ripped the save from another answer, since I forgot to save original model 
def save(self, *args, **kwargs): 
    if self.id is None: 
     super(ModelName, self).save(*args, **kwargs) 

def delete(self, *args, **kwargs): 
    return 

Probablemente también deba generar una excepción si se intenta que ocurra una eliminación o actualización en lugar de simplemente regresar. Desea indicar al usuario qué está sucediendo, que el comportamiento no es válido.

+0

¿Cómo puedo crear instancias de ese modelo en primer lugar? –

+0

Sí, olvidé poner la verificación de identificación para ver si era una actualización o un guardado. He actualizado la respuesta. –

+0

+1 por la sugerencia de lanzar una excepción en la actualización/eliminación para notificar al usuario. –

3

Además de otras soluciones: Si su objetivo principal es evitar el acceso de escritura desde el administrador, puede modificar la clase de administración utilizada para que nadie tenga un permiso de añadir/cambio:

class HistoryAdmin(admin.ModelAdmin): 

    def has_add_permission(self, request): 
     return False 

    def has_change_permission(self, request, obj=None): 
     return False 

    def has_delete_permission(self, request, obj=None): 
     return False 
+5

Readonly significa que todavía se pueden leer. Si elimina el permiso de modificación, ya no es así. – webjunkie

1

Si Don 't desea un intento de modificar un registro para fallar silenciosamente:

def save(self, *args, **kwargs): 
    if self.pk: 
     (raise an exception) 
    super(YourModel, self).save(*args, **kwargs) 


def delete(self, *args, **kwargs): 
    (raise an exception) 
Cuestiones relacionadas