2016-08-28 2 views
2

Es gibt Beiträge, wie zu set, get, KeyProperty/StructuredProperty, aber nichts sagt mir, wie man NDB für die Modellierung von vielen zu verwenden.GAE Python: Wie NDB KeyProperty-Modelle für viele-zu-eins-Beziehung verwenden?

Ich habe zwei Modelle:

class Department(ndb.Model): 
    department_id = ndb.IntegerProperty() 
    name   = ndb.StringProperty() 

class Student(ndb.Model): 
    student_id = ndb.IntegerProperty() 
    name  = ndb.StringProperty() 
    dept = ndb.KeyProperty(Kind=Department) 

Wie wird die many-to-one gewährleistet ist, das heißt, wenn ein Einsatz in Rekord Student ist, es muss Abteilung Schlüssel w.r.t zur Abteilung Datenspeicher validieren?

Wie fügen Sie einen Schülerbericht ein, um eine Viele-zu-Eins-Beziehung sicherzustellen?

Option 1:

# Insert student record without checking for valid dept id. GAE automatically validates 
student = Student(student_id=...., dept=ndb.Key(Department, input_dept_id)) 

Option 2:

# check for valid dept id and then insert student record 
dept_key = ndb.Key(Department, input_dept_id) 
if(dept_key.get()): 
    student = Student(student_id=...., dept=dept_key) 

Ich habe versucht, die Option 1 mit einem dept_id nicht in Abteilung Einheiten und es war in der Lage, dass die Schüler Entität einzufügen. Ich bin GAE ziemlich neu.

+1

GAE wird Ihre Schlüssel nicht "validieren" und lässt Sie einen beliebigen Schlüssel verwenden, auch wenn er nicht auf eine vorhandene Entität verweist. Sie müssen sicherstellen, dass Sie selbst gültige Schlüssel verwenden. Ihre Option 2 ist eine Lösung. –

+0

Eine Sache zu beachten Sie Code hat Abteilung als eine Klasse. Also Abteilung in jedem Schlüssel Konstruktor sollte "Abteilung" - "Student (student_id = ...., dept = ndb.Key (" Abteilung ", input_dept_id))' –

+0

@TimHoffman, Vielen Dank für die Eingabe. Abteilung ohne Anführungszeichen scheint für mich zu arbeiten. Es ist in der Lage, die Entität zu holen. – psun

Antwort

1

Gemäß der Dokumentation (https://cloud.google.com/appengine/docs/python/datastore/entities) "unterscheidet die Datastore-API nicht zwischen dem Erstellen einer neuen Entität und dem Aktualisieren einer vorhandenen Entität". Das heißt, die Methode put() erstellt entweder eine nicht vorhandene Entität oder aktualisiert eine vorhandene Entität.

Also, Option 2 scheint der Weg zu gehen. (Option 1 bietet tatsächlich keine Validierung)

+0

Danke. Überlegte, ob dies einer referenziellen Einschränkung wie in einer relationalen Datenbank entspricht. – psun