Frage

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

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

eine Ausnahme beim Rendern: ( " 'read_only_view id ' Unbekannte Spalte in 'Feldliste'" 1054)

Es ist kein Primärschlüssel Ich kann in der Ansicht sehen. Gibt es eine Abhilfe?

Kommentar:
Ich habe keine Kontrolle über die Ansicht, die ich mit Django bin erreichbar. MySQL-Browser zeigt Spalten gibt aber keine Primärschlüssel.

War es hilfreich?

Lösung

Wenn Sie sagen: ‚Ich habe keine Kontrolle über die Ansicht, die ich mit Django bin erreichbar. MySQL-Browser zeigt Spalten gibt aber keinen Primärschlüssel. "

Ich nehme an, Sie meinen, dass dies ein Vermächtnis Tabelle ist und Sie nicht hinzufügen oder ändern Spalten erlaubt?

Wenn ja, und es ist wirklich nicht ein Primärschlüssel ist (auch ein String oder nicht-int Spalt *), dann hat die Tabelle nicht sehr gut eingerichtet und Leistung könnte gut stinken.

Es ist allerdings nicht für Sie. Alles, was Sie brauchen, ist eine Spalte, die für jede Zeile eindeutig sein garantiert. Gesetzt, dass sein ‚primary_key = True in Ihrem Modell und Django werden glücklich sein.

  • Es gibt eine weitere Möglichkeit, die problemmatic wäre. Wenn es keine Spalte, die einzigartig ist garantiert sein, dann könnte die Tabelle mit zusammengesetzten Primärschlüssel sein. Das heißt - es wird spezifiziert, dass zwei zusammengenommen Spalten einen eindeutigen Primärschlüssel zur Verfügung stellen. Dies ist absolut gültige relationale Modellierung aber leider nicht unterstützt von Django. In diesem Fall können Sie neben rohen SQL nicht viel tun, wenn Sie eine weitere hinzugefügt bekommen kann.

Andere Tipps

Ich habe dieses Problem die ganze Zeit. Ich habe eine Ansicht, die ich kann nicht oder will nicht ändern, aber ich mag eine Seite haben Composite-Informationen (möglicherweise im Admin-Bereich) angezeigt werden soll. Ich überschreiben nur die sparen und eine NotImplementedError erhöhen:

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

(obwohl dies wahrscheinlich nicht in den meisten Fällen notwendig, aber es macht mich ein bisschen besser fühlen)

ich auch auf False in der Meta-Klasse festgelegt verwaltet werden.

    class Meta:
       managed = False

Dann nehme ich jedes Feld nur und es als Primärschlüssel markieren. Es spielt keine Rolle, ob es wirklich einzigartig ist, mit Ihnen nur Filter tun, Informationen auf einer Seite für die Anzeige, etc.

Es scheint gut für mich zu arbeiten. Bitte commment wenn es irgendwelche Probleme mit dieser Technik sind, dass ich mit Blick auf.

Wenn es wirklich ist kein Primärschlüssel in der Ansicht, dann gibt es keine Abhilfe.

Django erfordert jedes Modell genau primary_key=True ein Feld zu haben.

Es hätte die ein automatisch generierte id Feld, wenn Sie syncdb laufen (wenn es kein Primärschlüssel in Ihrem Modell definiert ist, dann wird Django einen AutoField für Sie einfügen).

Dieser Fehler bedeutet, dass Django Ihre Datenbank für das id Feld fragt, aber keiner vorhanden ist. Können Sie django manage.py dbshell laufen und dann DESCRIBE read_only_view; und das Ergebnis posten? Dies wird alle Spalten zeigt, die in der Datenbank vorhanden sind.

Alternativ können Sie umfassen die Modelldefinition, die Sie ausgeschlossen? (Und bestätigen Sie, dass Sie die Modelldefinition geändert haben, seit Sie syncdb lief?)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top