2014-09-15 3 views
3

Очень странно: PyMongo запрос нормально, но Mongoengine запрос ничего:PyMongo запрос нормально, но Mongoengine запрос ничего

class VkWallPostListView(ListView): 
    model = VkWallPost 
    context_object_name = "vk_list" 

    def get_template_names(self): 
     return ["blog/vk_list.html"] 

    def get_queryset(self): 
     wallposts = VkWallPost.objects 
     if 'all_posts' not in self.request.GET: 
      #wallposts = wallposts.filter(text='S') 
      wallposts = VkWallPost._get_collection().find({"text":'S'}) 
     tag = self.request.GET.get('tag', None) 
     if tag: 
      wallposts = wallposts.filter(tags=tag) 

     return wallposts 

Опция wallposts = VkWallPost._get_collection().find({"text":'S'}) возвращать объекты, но тот же Mongoengine wallposts = wallposts.filter(text='S') не работает - пустые результаты, без ошибок! Чем больше: у меня тот же класс, что и запрос к другой коллекции - там Mongoengine работает нормально.

+0

Если VkWallPost является вашей моделью mongoengine, вы можете использовать VkWallPost.objects (text = 'S'), чтобы отфильтровать наши объекты. –

+0

@Rajsubit - возможно, вы пропустили эту линию wallposts = VkWallPost.objects - точно так же уже сделаны –

ответ

1

Похоже, что ваш VkWallPostListView не наследует напрямую от mongoengine.Document. Я недавно столкнулся с этим также, когда идентичная модель схемы базы данных ничего не возвращала при запросе, когда она унаследовала от чего-то другого, кроме базового класса Document. Оказывается, mongoengine добавляет скрытое поле в документы дочернего класса, называемые _cls, и автоматически проверяет это при запросе.

Например:

Если у меня есть класс TextHolder, что является основой моего класса Post

class TextHolder(mongoengine.Document): 
    text = mongoengine.StringField() 
    meta = { 'allow_inheritance' : True, 
      'abstract' : True } 

class Post(TextHolder): 
    user = mongoengine.ReferenceField(User) 

Если бы я попытался запросить по должностям, которые уже существуют в базе данных, они не будут иметь поле _cls, определенное в их документах. Таким образом, способ запроса документов, которые не соответствуют этому стандарту, - это сделать это.

Post.objects(user=user_to_query_by, class_check=False) 

Это даст мне все объекты, игнорируя _cls поле, а не проверка на совпадение с именем класса текущей модели.

Смежные вопросы