2016-02-20 2 views
0

Я пытаюсь построить webapp с флягой и mongoengine, но застрял в следующей проблеме.Запрос сложной схемы JSON с mongoengine

Предположим, что существует документ с JSON структуры, как это:

"user": { 
    "value": "username", 
    [...] 
}, 
"entities": [ 
    { 
    "key": "foo", 
    "value": "123" 
    }, 
    "key": "bar", 
    "value": "456" 
    }, 
    [...] 
] 

1) Сначала я хочу получить весь документ от пользователя "имя пользователя", я попробовал:

userdata = models.User.objects(user__match = {"value": "username"}) 

но это возвращает пустой документ. Я также пытался что-то вроде этого:

userdata = models.User.objects(user__contains = "username") 

Но потом я получил: AttributeError: 'str' object has no attribute 'get'

Я читал документы, и прокрался вокруг, но ничего не нашел полезное.

2) Когда документ получил (наконец-то) из БД, мне нужно, чтобы поймать всех value сек от entities для отображения, что в шаблоне jinja2, но понятия не имеют, как это удалось.

Это (часть) модель:

class Username(EmbeddedDocument): 
    value = StringField(
     primary_key = True, 
     unique = True) 
    created = DateTimeField(
     require = True, 
     default = datetime.utcnow()) 

class Entities(EmbeddedDocument): 
    etype = StringField(
     require = True, 
     choices = ENTITYTYPES) 
    key = StringField(
     require = True, 
     choices = ENTITIES) 
    value = StringField(
     require = True) 
    modiefied = DateTimeField(
     require = True, 
     default = datetime.utcnow()) 

class User(Document): 
    user = EmbeddedDocumentField(
     Username) 
    entities = ListField(
     GenericEmbeddedDocumentField(Entities)) 

Как уже упоминалось из @Paul я попробовал некоторые запросы:

userdata = models.User.objects.get(entities={"key": "foo"}) 

Результат: AttributeError: 'dict' object has no attribute 'to_mongo'

userdata = models.User.objects(entities={"key": "foo"}) 

Результат: AttributeError: 'dict' object has no attribute 'to_mongo'

userdata = models.User.objects(user__entities = {"key": "foo"}) 

Результат: mongoengine.errors.InvalidQueryError: Cannot resolve field "user"

userdata = models.User.objects.get(entities={"key": "foo"}) 

Результат: AttributeError: 'dict' object has no attribute 'to_mongo'

userdata = models.User.objects(__raw__={"key": "foo"}) 

Результат: []

userdata = models.User.objects(key='foo') 

Результат: mongoengine.errors.InvalidQueryError: Cannot resolve field "key"

+0

напишите свой код пользователя и источник JSON в верхней части вашего вопроса. –

+1

добавлена ​​модель, вопросы и результаты – ic14

ответ

0

Am i right, что у модели User есть поле user, и это поле является dict? Что делать, если вы попробуете это:

userdata = models.User.objects.get(user={"value": "username"}) # will return one 
userdata = models.User.objects(user={"value": "username"})  # will return multiple 

Или это:

userdata = models.User.objects(user__user = {"value": "username"}) 
+0

Спасибо за упоминание. Но он не работает :-( 'models.User.objects.get (..)' поднимает 'app.models.DoesNotExist: запрос соответствия пользователя не существует.' 'models.User.objects (. ..) 'является пустой результирующий набор ' models.User.objects (user__user = (...)) '' генерировать mongoengine.errors.InvalidQueryError: не удается разрешить поле "пользователь" ' Этот материал сводит меня с ума :) – ic14

1

При дальнейшем поиске вокруг, я наткнулся на this Question и this.

Собираем их вместе принесли этот ответ на мой первый вопрос:
data = models.User.objects(__raw__ = { 'user.value': 'username' })

Так я получаю данные от пользователя. Для того, чтобы разобраться в Jinja2, я обнаружил, что Question и that, и поэтому я пришел к этому шаблону:

{% for dict_item in data %} 
    {% for item in dict_item['entities'] %} 
    <h1>Key: {{item['key']}}</h1> 
    <h2>Value: {{item['value']}}</h2> 
    {% endfor %} 
{% endfor %} 

Только для документации: Если вам нужно напечатать mongoengine запрос в оболочке, используйте:

from bson import json_util 
objects = models.User.objects.all() 
json_util.dumps(objects._collection_obj.find(objects._query)) 
Смежные вопросы