Domanda

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

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

È stata rilevata un'eccezione durante il rendering: (1054, " Colonna sconosciuta 'read_only_view. id ' in 'elenco campi' ")

Non c'è nessuna chiave primaria che posso vedere nella vista. C'è una soluzione alternativa?

Commento:
Non ho alcun controllo sulla vista a cui accedo con Django. Il browser MySQL mostra colonne lì ma nessuna chiave primaria.

È stato utile?

Soluzione

Quando dici 'Non ho alcun controllo sulla vista a cui accedo con Django. Il browser MySQL mostra colonne lì ma nessuna chiave primaria. '

Presumo che tu intenda che si tratta di una tabella legacy e che non ti è permesso aggiungere o modificare colonne?

In tal caso e in realtà non esiste una chiave primaria (anche una stringa o una colonna non int *), la tabella non è stata impostata molto bene e le prestazioni potrebbero puzzare.

Tuttavia non ti importa. Tutto ciò che serve è una colonna che è garantita per essere unica per ogni riga. Impostalo su 'primary_key = True nel tuo modello e Django sarà felice.

  • C'è un'altra possibilità che potrebbe essere problematica. Se non esiste alcuna colonna che sia garantita come unica, la tabella potrebbe utilizzare chiavi primarie composite. Cioè - sta specificando che due colonne prese insieme forniranno una chiave primaria univoca. Questo è un modello relazionale perfettamente valido ma sfortunatamente non supportato da Django. In tal caso non puoi fare molto oltre a SQL raw a meno che tu non possa aggiungere un'altra colonna.

Altri suggerimenti

Ho questo problema tutto il tempo. Ho una visione che non posso o non voglio cambiare, ma voglio avere una pagina per visualizzare informazioni composte (forse nella sezione admin). Ho appena ignorato il salvataggio e generato un NotImplementedError:

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

(anche se questo probabilmente non è necessario nella maggior parte dei casi, ma mi fa sentire un po 'meglio)

Ho anche impostato gestito su False nella classe Meta.

    class Meta:
       managed = False

Quindi seleziono qualsiasi campo e lo taggo come chiave primaria. Non importa se è davvero unico con te stai solo facendo filtri per visualizzare informazioni su una pagina, ecc.

Sembra funzionare bene per me. Si prega di iniziare se ci sono problemi con questa tecnica che sto trascurando.

Se nella vista non è presente nessuna chiave primaria , non esiste soluzione alternativa.

Django richiede che ogni modello abbia esattamente un campo primary_key = true .

Dovrebbe esserci stato un campo id generato automaticamente quando hai eseguito syncdb (se nel modello non è stata definita una chiave primaria, Django inserirà un AutoField per te).

Questo errore indica che Django richiede al tuo database il campo id , ma non esiste nessuno. Puoi eseguire django manage.py dbshell e quindi DESCRIBE read_only_view; e pubblicare il risultato? Questo mostrerà tutte le colonne che si trovano nel database.

In alternativa, puoi includere la definizione del modello che hai escluso? (e conferma di non aver modificato la definizione del modello da quando hai eseguito syncdb ?)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top