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