【问题标题】:One-To-Many Example in NDBNDB 中的一对多示例
【发布时间】:2012-04-22 01:37:18
【问题描述】:

我正在尝试创建像学生和科目这样的 ndb.Model 类

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

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

一个学生可以有很多科目。如何在这个模型中添加和存储这些。我找不到任何例子。对于字符串属性 .. 有字段属性,即 repeat=true

如何实现这一点,网络上是否有任何工作示例。抱歉,如果这是重复的问题,但我尝试以我有限的技能搜索此论坛。

【问题讨论】:

  • 已解决。在模型中添加为:subject = ndb.KeyProperty(kind=Subject,repeated=True) 然后在添加方法时在 Student 对象中添加 std = Student() sub1 = Subject() sub2 = Subject() sub1.put() sub2.put() std.subject .append(sub1) std.subject.append(sub2) std.put()
  • 您知道是否可以使用批量加载程序导入转换上传重复的属性?
  • Anjana 在您的评论中进行了更正,您不应该执行 std.subject.append(sub2.key()) 吗?
  • @Milwaukoholic 我认为你会做 std.subject.append(sub2.key)

标签: google-app-engine app-engine-ndb


【解决方案1】:

当我需要 1 到多个时,我会使用重复的 keyProperties。 代码:

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

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

模板:

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

ndb 是 nosql,因此您不会在子级中找到对父级的引用。 但是,您可以像这样添加它。创建新学科时不要忘记设置学生键值。

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)

【讨论】:

    【解决方案2】:

    使用主题作为关键。

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

    【讨论】:

    • 一个警告,要获取名称,您应该使用 key() 的 name() 方法(例如:“me.key().name()”),您可以添加一个构造函数如果需要,可以将 key_name 保存到 name 属性。
    • 感谢 KurzedMetal。欣赏它。我正在寻找的是学生是否与多个科目相关联。即如果 Student 与 Programming 以及 DBMS 和许多其他相关联。你怎么能做到这一点?
    【解决方案3】:

    定义:

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

    用法:

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

    【讨论】:

      【解决方案4】:

      这似乎是一个老问题。如果其他人目前需要这个,你应该看看Structured Propertieshttps://developers.google.com/appengine/docs/python/ndb/properties#structured。这个例子非常清晰易懂。

      【讨论】:

      • 结构化属性不能完全发挥一对多关系的作用,因为您无法将地址(在该示例中)与其他任何东西相关联。
      • 这只是强制属性的结构,它不会创建一对多的关系。
      猜你喜欢
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多