Фильтрация запроса по дочернему элементу в движке приложения (python)

1

У меня есть модель вопроса, и модель ответа, у которой родительский объект задан таким образом:

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

Учитывая пользователя, как я могу получить ответы на все вопросы, на которые пользователь не ответил?

  • 0
    Связывает ли что-нибудь кроме ответа вопрос пользователю?
  • 0
    Я также установил родителя Вопроса для Пользователя. Извините, я не уточнил.
Теги:
google-app-engine
google-cloud-datastore

2 ответа

1
Лучший ответ

Одним из решений было бы сохранить список вопросов, на которые пользователь ответил. Вы можете сохранить эти списки в группе пользовательских сущностей и использовать текущий месяц (например) в качестве имени ключа.

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)

Вы можете продлить это, чтобы проверить самый старый месяц в возвращаемых вопросах. Вы также можете расширить это, чтобы получить выборку, если не было возвращено достаточно вопросов.

1

Как предложил Роберт Клуин, вам следует рассмотреть вопрос о добавлении свойства "ответили" в объект "Вопрос". Тем не менее вы можете добиться такого же. Но это неприятное решение вашей проблемы

questions=Question.all().ancestor(user)
result = []
for question in questions:
    responded = Response.all().ancestor(question).get()
    if responded is not None:
       result.append(responded)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню