Frage

Gibt es eine Möglichkeit, den Schlüssel (oder id) Wert eines db.ReferenceProperty zu bekommen, ohne dereferencing die tatsächliche Entität es auf die Punkte? Ich habe gegraben um - es sieht aus wie der Schlüssel als Name der Eigenschaft mit einer Voranstellung gespeichert wird _, aber ich habe es nicht gelungen, arbeitet jeden Code zu erhalten. Beispiele würden sehr geschätzt werden. Danke.

EDIT: Hier ist, was ich habe erfolglos versucht:

class Comment(db.Model):
    series = db.ReferenceProperty(reference_class=Series);

    def series_id(self):
        return self._series

Und in meiner Vorlage:

<a href="games/view-series.html?series={{comment.series_id}}#comm{{comment.key.id}}">more</a>

Das Ergebnis:

<a href="games/view-series.html?series=#comm59">more</a>
War es hilfreich?

Lösung

Eigentlich ist die Art und Weise, die Sie befürworten sind der Schlüssel für einen Zugriff auf Reference könnte auch in Zukunft nicht mehr existieren. Attribute, die mit ‚_‘ in Python beginnen, werden allgemein akzeptiert werden „geschützt“, dass Dinge, die eng gebunden und intim sind mit der Umsetzung sie verwenden können, aber die Dinge, die mit der Implementierung aktualisiert werden, müssen sich ändern, wenn sie sich ändert.

Es gibt jedoch eine Möglichkeit, durch die öffentliche Schnittstelle, die Sie den Schlüssel für Ihr Referenz-Objekt zugreifen können, so dass es in Zukunft sicher sein. Ich werde das obige Beispiel revidieren:

class Comment(db.Model):
    series = db.ReferenceProperty(reference_class=Series);

    def series_id(self):
        return Comment.series.get_value_for_datastore(self)

Wenn Sie Eigenschaften über die Klasse zugreifen sie zugeordnet ist, erhalten Sie das Eigenschaftsobjekt selbst, die eine öffentliche Methode, die die zugrunde liegenden Werte erhalten.

Andere Tipps

Sie haben recht - der Schlüssel wird als Eigenschaftsnamen gespeichert mit dem Präfix ‚_‘. Sie sollten nur in der Lage sein, es auf dem Modellobjekt direkt zuzugreifen. Können Sie zeigen, was Sie versuchen? Ich habe diese Technik in der Vergangenheit ohne Probleme verwendet.

Edit: Haben Sie versucht, ruft series_id () direkt oder _series in Ihrer Vorlage direkt werben? Ich bin nicht sicher, ob Django automatisch ruft Methoden ohne Argumente, wenn man sie in diesem Zusammenhang angeben. Sie könnten auch versuchen, über die Methode der @property Dekorateur setzen.

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