2012-04-09 1 views
7

Sto cercando di creare classe ndb.Model come studenti e soggettiUno-a-molti Esempio in NDB

class Subject(ndb.Model): 
    name = ndb.StringProperty() 

class Student(ndb.Model): 
    name = ndb.StringProperty() 
    subject = ndb.KeyProperty(kind=Subject) 

Uno studente può avere molti argomenti. Come aggiungere e archiviare questi in questo modello. Non ho trovato alcun esempio. Per la proprietà String .. esiste una proprietà di campo, ad es. Repeat = true

Come ottenere ciò ed esiste un esempio operativo sul web. Scusa se si tratta di una domanda duplicata, ma ho provato con le mie competenze limitate per cercare in questo forum.

+3

Risolto. Aggiunta nel modello come: 'subject = ndb.KeyProperty (tipo = Soggetto, ripetuto = True)' e poi quando si aggiunge l'oggetto method..in Student basta aggiungere std = Student() sub1 = Soggetto() sub2 = Soggetto() sub1.put() sub2.put() std.subject.append (sub1) std.subject.append (sub2) std.put() – Anjana

+0

sapete se c'è un modo per caricare proprietà ripetute usando le trasformazioni di importazione del bulkloader? – mehulkar

+0

Anjana nel tuo commento con la correzione, non dovresti fare std.subject.append (sub2.key())? – Milwaukoholic

risposta

1

Utilizzare il soggetto come chiave.

me = Student(key_name='KurzedMetal') 
programming = Subject(key_name='Programming') 
programming.put() 
me.subject = programming.key() 
me.put() 
+0

un avvertimento, per ottenere il nome dovresti usare il metodo name() della chiave() (ad esempio: "me.key(). Name() "), è possibile aggiungere un costruttore per salvare il nome_chiave nella proprietà name, se lo si desidera. – KurzedMetal

+0

Grazie KurzedMetal. Apprezzalo. Quello che sto cercando è se ci sono più di una materia a cui lo studente è associato. Ad esempio, se lo studente è associato a ** Programmazione ** e anche con ** DBMS ** e molti altri. Come puoi ottenerlo? – Anjana

0

Questa sembra una vecchia domanda. Nel caso in cui qualcun altro ha bisogno di questo al momento, si dovrebbe guardare Structured Propertieshttps://developers.google.com/appengine/docs/python/ndb/properties#structured. L'esempio è molto chiaro e facile da seguire.

+2

Le proprietà strutturate non ricoprono il ruolo esatto di una relazione 1-a-molti, poiché non è possibile correlare gli indirizzi (in questo esempio) a qualcos'altro. – zigdon

+1

Questo semplicemente impone la struttura di una proprietà, non crea una relazione uno-a-molti. – foundatron

8

Quando ho bisogno di 1 a molti uso le chiavi ripetute. Codice:

class Subject(ndb.Model): 
    name = ndb.StringProperty() 

class Student(ndb.Model): 
    name = ndb.StringProperty() 
    subjects = ndb.KeyProperty(kind='Subject', repeated=True) 

modello:

{% for subject in student.subjects %} 
    {{subject.get().name}} 
{% endfor %} 

ndb è NoSQL in modo che non troverete riferimento al genitore nel bambino. Tuttavia, è possibile aggiungerlo in questo modo. Non dimenticare di impostare il valore della chiave dello studente quando si crea un nuovo soggetto.

class Subject(ndb.Model): 
    name = ndb.StringProperty() 
    student = ndb.KeyProperty(kind='Student') 

class Student(ndb.Model): 
    name = ndb.StringProperty() 
    subjects = ndb.KeyProperty(kind='Subject', repeated=True) 
1

Definizione:

class Subject(ndb.Model): 
    name = ndb.StringProperty() 

class Student(ndb.Model): 
    name = ndb.StringProperty() 
    subject = ndb.KeyProperty(kind=Subject,repeated=True) 

Usage:

subject1 = Subject() 
subject1.put() 
subject2 = Subject() 
subject2.put() 
student = Student() 
student.subject.append(subject1.key) 
student.subject.append(subject2.key) 
student.put()