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

22

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

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

4 ответа

34

Как насчет того, чтобы просто использовать метод 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
Показать остальные комментарии
18

Расширяя ответы @ 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
5
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
0

объединяя все остальные ответы,

import json
dict = {'data':[json.loads(ob.to_json()) for ob in qset]}
    
ответ дан cegprakash 14.06.2018 в 16:43