GAE найти объекты с элементом не в ListProperty - PullRequest
0 голосов
/ 23 октября 2011

У меня есть небольшое приложение, где я передаю сообщения между пользователями. Моя модель для сообщения выглядит так

class Message(db.Model):
    from = db.UserProperty()
    sent_to_users = db.ListProperty(db.Key)

Я отправляю сообщение пользователям, если они в сети, поэтому, когда я обнаруживаю, что пользователь находится в сети, я отправляю любое сообщение, которое ему еще не было отправлено. Я делаю message.sent_to_users.append(user) в обработчике / chat / присутствии / available . Чтобы указать, что сообщение уже было отправлено на user

Мой вопрос заключается в том, как отфильтровать сообщения, которые уже были отправлены пользователю. В соответствии с разделом фильтр неравенства в запросах a != переводится в два запроса для значений больше и меньше, а затем результаты объединяются. Что само собой разумеется, не работает в случае списка ключей. В основном members_not_sent_message = Message.all().filter('sent_to_users !=', available_user).fetch(100) не работает.

Есть ли способ найти значения, отсутствующие в ListProperty, или мне нужно просмотреть каждый элемент и найти сообщения, которые не были отправлены? Или есть другой дизайн для такой системы, который обходит это ограничение хранилища данных GAE (если оно есть в этом случае)?

Ответы [ 3 ]

2 голосов
/ 23 октября 2011

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

Рассмотрите возможность сохранения двух списков: помимо списка sent, сохраните список not_sent и запросите его.

0 голосов
/ 24 октября 2011

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

0 голосов
/ 23 октября 2011
...