2009-07-06 2 views
0

Как я могу получить данные Labels из моей модели задач?App Engine db.model reference question

class Task(db.Model): 
    title = db.StringProperty() 

class Label(db.Model): 
    name = db.StringProperty() 

class Tasklabel(db.Model): 
    task = db.ReferenceProperty(Task) 
    label = db.ReferenceProperty(Label) 

создания ассоциации это не проблема, но как я могу получить на этикетках, связанных с задачей, как:

task = Task.get('...') 
for label in task.labels 

ответ

1

Вы не хотите ListProperty на задачи, как это сделать много -слишком много?

class Label(db.Model) 
    name = db.StringProperty() 

    @property 
    def members(self): 
     return Task.gql("WHERE labels = :1", self.key()) 

class Task(db.Model) 
    title = db.StringProperty(); 
    labels = db.ListProperty(db.Key) 

Тогда вы могли бы сделать

foo_label = Label.gql("WHERE name = 'foo'").get() 
task1 = Task.gql("WHERE title = 'task 1'").get() 
if foo_label.key() not in task1.labels: 
    task1.labels.append(foo_label.key()) 
task1.put() 

Там есть кап статья о моделировании отношений сущностей на Google code. Я украл код из этой статьи.

+0

Возможно, это решение, я думал, что смогу это сделать без –

+0

Ум, если я спрошу, почему? Утилита appengine datastore, похоже, упрощает устранение таблиц соединений, таких как TaskLabel, которые являются общими для РСУБД. – seth

+0

Я вижу, что использование listproperty может быть правильным решением –

2

Это работает для меня с текущим DataModel:

taskObject = db.Query(Task).get() 
for item in taskObject.tasklabel_set: 
     item.label.name 

Или вы можете удалить класс этикетки и просто сделать отношения один-ко-многим между Task и TaskLabel:

class Task(db.Model): 
     title = db.StringProperty() 

class TaskLabel(db.Model): 
     task = db.ReferenceProperty(Task) 
     label = db.StringProperty() 

Тогда

taskObject = db.Query(Task).get() 
for item in taskObject.tasklabel_set: 
     item.label 

Вот совет от статьи Google по моделированию отношений в данных tore

Определив его как ReferenceProperty, вы создали свойство, которому могут быть присвоены только значения типа «Задача». Каждый раз, когда вы определяете свойство reference, он создает неявное свойство коллекции в ссылочном классе. По умолчанию эта коллекция называется _set. В этом случае он создаст свойство Task.tasklabel_set.

В статье можно найти here.

Я также рекомендую поиграть с этим кодом в интерактивной консоли на сервере приложений.

+0

как я могу «поиграть с этим кодом в интерактивной консоли на DevServer»? У Django есть один, но я не нашел его для GAE. –

+0

Когда у вас есть dev_appserver, запущенный на вашем локальном компьютере, вы можете перейти на http: // localhost: 8080/_ah/admin/interactive и проверить фрагменты кода там. Вам нужно будет предоставить обычные операторы импорта для работы вашего кода. Введите код и нажмите «запустить программу» внизу. –

+0

Это ответ на ваш вопрос? –