Pregunta

class dbview(models.Model):
    # field definitions omitted for brevity
    class Meta:
        db_table = 'read_only_view'

def main(request):
    result = dbview.objects.all()

Capturó una excepción al procesar: (1054, " Columna desconocida 'read_only_view. id ' en 'lista de campos' ")

No hay clave principal que pueda ver en la vista. ¿Hay alguna solución?

Comentario:
No tengo control sobre la vista a la que estoy accediendo con Django. El navegador MySQL muestra columnas allí pero no hay clave principal.

¿Fue útil?

Solución

Cuando dice 'No tengo control sobre la vista a la que estoy accediendo con Django. El navegador MySQL muestra columnas allí, pero no hay clave principal. '

Supongo que quiere decir que esta es una tabla heredada y no tiene permiso para agregar o cambiar columnas.

Si es así y realmente no hay una clave principal (incluso una cadena o una columna no int *), entonces la tabla no se ha configurado muy bien y el rendimiento podría apestar.

Sin embargo, no te importa. Todo lo que necesita es una columna que se garantiza que sea única para cada fila. Establece que sea 'primary_key = True en tu modelo y Django estará feliz.

  • Hay otra posibilidad que sería problemática. Si no hay una columna que se garantice que sea única, entonces la tabla podría estar usando claves primarias compuestas. Es decir, está especificando que dos columnas juntas proporcionarán una clave principal única. Este es un modelo relacional perfectamente válido pero desafortunadamente no es compatible con Django. En ese caso, no puede hacer mucho más que el SQL sin formato a menos que pueda agregar otra columna.

Otros consejos

Tengo este problema todo el tiempo. Tengo una vista que no puedo o no quiero cambiar, pero quiero tener una página para mostrar información compuesta (tal vez en la sección de administración). Acabo de anular el guardado y levanto un error NotImplemented:

    def save(self, **kwargs):
        raise NotImplementedError()

(aunque esto probablemente no sea necesario en la mayoría de los casos, pero me hace sentir un poco mejor)

También establecí que se manejó Falso en la clase Meta.

    class Meta:
       managed = False

Luego, elijo cualquier campo y lo etiqueta como la clave principal. No importa si es realmente único, solo estás haciendo filtros para mostrar información en una página, etc.

Parece que funciona bien para mí. Por favor comente si hay algún problema con esta técnica que estoy pasando por alto.

Si realmente no hay ninguna clave principal en la vista, entonces no hay solución.

Django requiere que cada modelo tenga exactamente un campo primary_key = True .

Debería haber un campo id generado automáticamente cuando ejecutó syncdb (si no hay una clave principal definida en su modelo, Django insertará un AutoField para usted).

Este error significa que Django le está pidiendo a su base de datos el campo id , pero no existe ninguno. ¿Puede ejecutar django manage.py dbshell y luego DESCRIBE read_only_view; y publicar el resultado? Esto mostrará todas las columnas que están en la base de datos.

Alternativamente, ¿puede incluir la definición del modelo que excluyó? (y confirme que no ha modificado la definición del modelo desde que ejecutó syncdb ?)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top