Фильтрация запроса дочерним объектом в app engine (python)

#python #google-app-engine #google-cloud-datastore

#python #google-движок приложений #google-облако-хранилище данных #google-app-engine

Вопрос:

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

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

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

Комментарии:

1. Привязывает ли вопрос к пользователю что-нибудь, кроме ответа?

2. Я также установил родительский элемент вопроса для User. Извините, я не уточнил.

Ответ №1:

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

 class QuestionsAnswered(db.Model):
    answered = db.ListProperty(db.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)
  

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

Ответ №2:

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

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