У меня есть модель вопроса, и модель ответа, у которой родительский объект задан таким образом:
class Question(db.Model):
myQuestion = db.StringProperty()
class Response(db.Model):
responder = db.ReferenceProperty(reference_class = User, collection_name = 'my_responses')
myResponse = db.StringProperty()
def createQuestion(self, user, question):
Question(myQuestion = question, parent = user).put()
def respond(self, user, question, response):
Response(responder = user, myResponse = response, parent = question).put()
Учитывая пользователя, как я могу получить ответы на все вопросы, на которые пользователь не ответил?
Одним из решений было бы сохранить список вопросов, на которые пользователь ответил. Вы можете сохранить эти списки в группе пользовательских сущностей и использовать текущий месяц (например) в качестве имени ключа.
class QuestionsAnswered(db.Model):
answered = db.ListProperty(db.Key)
Задайте вопросыNeweded entity key- именам текущего месяца (мне нравится "201106", для instnace) и поместите их в группу пользовательских сущностей. Это облегчит выбор необходимых списков.
Чтобы получить список невидимых вопросов, вы можете сделать что-то вроде этого:
question_query = Questions.all().order('asked_date')
questions = questions.fetch(50)
if not questions:
# return ... nothing to do here
month = questions[0].asked_date.strftime('%Y%m')
answered_list = QuestionsAnswered.get_by_key_name(month, parent=user)
question_keys = [question.key() for question in questions]
new_question_keys = set(question_keys) - set(answered_list.answered)
Вы можете продлить это, чтобы проверить самый старый месяц в возвращаемых вопросах. Вы также можете расширить это, чтобы получить выборку, если не было возвращено достаточно вопросов.
Как предложил Роберт Клуин, вам следует рассмотреть вопрос о добавлении свойства "ответили" в объект "Вопрос". Тем не менее вы можете добиться такого же. Но это неприятное решение вашей проблемы
questions=Question.all().ancestor(user)
result = []
for question in questions:
responded = Response.all().ancestor(question).get()
if responded is not None:
result.append(responded)