7
votes

I am trying to create ndb.Model class like Students and subjects

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

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

One Student can have many Subjects. How to add and store these in this Model. I could not find any example of it. For String Property .. there is field property i.e. repeat=true

How to achieve this and is there any working example on the web. Sorry if it is duplicate question but I tried with my limited skills to search this forum.

4
Resolved. Added in the model as : subject = ndb.KeyProperty(kind=Subject,repeated=True) and then when adding the method..in Student object just add std = Student() sub1 = Subject() sub2 = Subject() sub1.put() sub2.put() std.subject.append(sub1) std.subject.append(sub2) std.put() - Anjana
Do you know if there is a way to upload repeated properties using bulkloader import transforms? - mehulkar
Anjana in your comment with the correction, aren't you supposed to do std.subject.append(sub2.key())? - Milwaukoholic
@Milwaukoholic I think you do std.subject.append(sub2.key) - Wade

4 Answers

7
votes

When I need 1 to many I use repeated keyProperties. Code:

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

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

template:

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

ndb is nosql so you will not find reference to the parent in the child. However, you could add it like that. Don't forget to set student key value when creating a new subject.

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
votes

Use the subject as a key.

me = Student(key_name='KurzedMetal')
programming = Subject(key_name='Programming')
programming.put()
me.subject = programming.key()
me.put()
1
votes

Definition:

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()
0
votes

This looks like an old question. In case someone else needs this presently, you should look at Structured Properties https://developers.google.com/appengine/docs/python/ndb/properties#structured. The example is very clear and easy to follow.