programing

mongodb 반환 개체를 사전으로 변환

telecom 2023. 5. 20. 10:07
반응형

mongodb 반환 개체를 사전으로 변환

저는 mongo 엔진과 함께 병 프레임워크를 사용하고 있습니다.주문 모델이 있습니다.

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))로 정의하는 동안에도 이 함수가 실패한다는 것을 알게 되었습니다.

또한 Embedded DocumentField의 특정 사례를 잡기 위한 조건을 작성해 보았습니다.

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

하지만 그것도 아무런 도움이 되지 않았습니다.

이 문제에 대한 해결 방법이 있는 사람이 있습니까?

그냥 사용하는 건 어때요?to_mongo그것을 받아쓰기로 변환하는 객체의 방법?

object.to_mongo()

@alexvasel 및 @z0r의 답변에 대한 확장, 전화.to_mongo()개체를 SON 인스턴스로 변환합니다.일단 그것을 갖게 되면, 당신은 그것을 사전으로 변환하는 방법을 호출할 수 있습니다.

예를 들면...(qsetmongo 엔진에서 반환되는 쿼리 집합입니다. Posts.objects.all()).

sons = [ob.to_mongo() for ob in qset]
for son in sons:
    print str(son.to_dict())
import json
json.loads(yourobj.to_json())

@alexvasel의 대답을 확장하면,to_mongo()메서드는 SON 개체를 반환합니다. 이 개체를 호출하여 dict로 변환할 수 있습니다.to_dict()방법

object.to_mongo().to_dict()

개체를 딕트로 변환하는 사용자 지정 방법

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

    def as_dict(self):
        return {
            "user_name": self.userName,
            "order_date": self.orderDate.strftime("%Y-%m-%d %H:%M:%S"),
        }

이제 당신은 obj.as _dll을 사용하여 받아쓸 수 있습니다.

orders = Order.objects.all()
datas = [each.as_dict() for each in orders]

다른 모든 대답들을 합하면,

import json
dict = {'data':[json.loads(ob.to_json()) for ob in qset]}

두 가지 시나리오가 있을 수 있습니다.

  1. 쿼리가 CommandCursor 개체를 반환하는 경우
    **records = list(CursorObject)**

    ex - Class.objects().aggregate({...})
  1. 쿼리가 BaseQuerySet 개체를 반환하는 경우
   **import json**

   **records = json.loads(BaseQuerySetObject.to_json())**

   ex - Class.objects().filter(..)

언급URL : https://stackoverflow.com/questions/13230284/convert-mongodb-return-object-to-dictionary

반응형