Конвертировать возвращаемый объект mongodb в словарь

20

Я использую рамки для бутылок вместе с монгогингом. У меня есть модель заказов:

class OrderDetail(Option):
    orderDetailsQty = FloatField()

    def to_dict(self):
        return mongo_to_dict_helper(self)


class Order(Document):
    userName = StringField(required=True)
    orderDate = DateTimeField()
    orderStatus = ListField(EmbeddedDocumentField(Status))
    orderDetails = ListField(EmbeddedDocumentField(OrderDetail))
    orderComments = ListField(EmbeddedDocumentField(Comment))
    isActive = BooleanField()

    def to_dict(self):
        orderObj = mongo_to_dict_helper(self)
        orderDetailList = []
        for orderDetail in orderObj["orderDetails"]:
            orderDetailList.append(orderDetail.__dict__)
        orderObj["OrderDetails"] = orderDetailList
        return (self)

Когда запрашивается mongodb, я получаю объект, который затем преобразуется в dict, используя следующую функцию:

def mongo_to_dict_helper(obj):
    return_data = []
    for field_name in obj._fields:
        if field_name in ("id",):
            continue
        data = obj._data[field_name]

        if isinstance(obj._fields[field_name], StringField):
            return_data.append((field_name, str(data)))
        elif isinstance(obj._fields[field_name], FloatField):
            return_data.append((field_name, float(data)))
        elif isinstance(obj._fields[field_name], IntField):
            return_data.append((field_name, int(data)))
        elif isinstance(obj._fields[field_name], ListField):
            return_data.append((field_name, int(data)))
        else:
            # You can define your logic for returning elements
            pass
    return dict(return_data)

Я нашел эту функцию после долгого поиска в Интернете. Позже выяснилось, что эта функция также терпит неудачу при определении члена как ListField (EmbeddedDocumentField (obj)).

Я также попытался написать условие для обнаружения конкретного случая EmbeddedDocumentField:

elif isinstance(obj._fields[field_name], EmbeddedDocumentField):
    return_data.append(mongo_to_dict_helper(data))

, но это тоже не принесло пользы.

У кого-нибудь есть обходной путь для этой проблемы?

    
задан mahesmohan 05.11.2012 в 11:35
источник
  • Вы пытаетесь преобразовать весь запрос в dict или только один документ? –  alexvassel 05.11.2012 в 11:42
  • Чего вы пытаетесь достичь? –  Ross 05.11.2012 в 11:46
  • Я пытался преобразовать один объект в json, я не знал о функции to_mongo () ... –  mahesmohan 05.11.2012 в 19:43

3 ответа

28

Как просто использовать метод to_mongo объекта, чтобы преобразовать его в dict?

object.to_mongo()
    
ответ дан alexvassel 05.11.2012 в 11:47
источник
  • Вот именно то, что я искал. Но все же я получаю ошибку TypeError, что ObjectId не сериализуем. –  mahesmohan 05.11.2012 в 20:16
  • Вставка ссылки на документацию to_mongo () будет значительно распространена, поскольку я не могу найти ее в любом месте. Благодаря @alexvassel –  mahesmohan 06.11.2012 в 07:38
  • На самом деле, я не нашел этот метод в официальной документации) Так что он смотрит только в источник) –  alexvassel 12.11.2012 в 11:25
  • @alexvassel, как использовать этот метод? из этого inbox = Inbox.objects.filter (messages__to_users__in = [имя_пользователя]). to_mongo () У меня этот объект BaseQuerySet не имеет атрибута 'to_mongo' –  holms 01.06.2014 в 09:52
  • @holms вы можете использовать понимание: [ob.to_mongo () для ob в query_set] –  z0r 02.10.2014 в 00:53
Показать остальные комментарии
15

Развернув ответы @ alexvassel и @ z0r, ​​вызов .to_mongo() преобразует объект в SON экземпляр . После этого вы можете вызвать метод .to_dict() конвертировать его в словарь .

Например ... ( qset - это запрос, который возвращается из mongoengine, например, Posts.objects.all() ).

sons = [ob.to_mongo() for ob in qset]
for son in sons:
    print str(son.to_dict())
    
ответ дан aralar 09.01.2015 в 07:09
источник
2
import json
json.loads(yourobj.to_json())
    
ответ дан roberto el boberto 15.05.2015 в 18:23
источник
  • Спасибо @roberto el boberto, что ты мужчина. –  Kaushik Makwana 26.04.2017 в 11:12