Как да изпълните .to_json() със SortedListField на ReferenceField

Имам клас със списък от ReferenceFields, нещо като това:

class MyClass(db.Document):
    meta = {
        ...
    }
    something: ReferenceField(OtherClass, required=True, reverse_delete_rule=CASCADE)
    otherthings = SortedListField(ReferenceField(AnotherClass), ordering='id')

Мога да създам обект на MyClass и той работи перфектно:

>>> h
<MyClass: MyClass object>
>>> h.id
ObjectId('54cf8f91b0ab4a2b7c5a71b6')
>>> h.otherthings
[<AnotherClass: AnotherClass(pk=54cf8fbeb0ab4a2d35631cf0)>, <AnotherClass: AnotherClass(pk=54cf8fc7b0ab4a2bd7abfe78)>, <AnotherClass: AnotherClass(pk=54cf8fd3b0ab4a2bda781fd5)>, <AnotherClass: AnotherClass(pk=54cf8fd3b0ab4a2b7c5a71b9)>, <AnotherClass: AnotherClass(pk=54cf8ffbb0ab4a2fa167f335)>, <AnotherClass: AnotherClass(pk=54cf9001b0ab4a2fcc6ae982)>, <AnotherClass: AnotherClass(pk=54cf9001b0ab4a2fcc6ae983)>, <AnotherClass: AnotherClass(pk=54cf9001b0ab4a3170f6cc00)>, <AnotherClass: AnotherClass(pk=54cf9002b0ab4a31566e9837)>, <AnotherClass: AnotherClass(pk=54cf9002b0ab4a2ffc13b055)>]

Но трябва да го върна чрез Flask, така че се опитвам да стартирам to_json(), но не работи:

>>> h.to_json()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/lala/whatever/.virtualenvs/whatever/local/lib/python2.7/site-packages/mongoengine/base/document.py", line 327, in to_json
return json_util.dumps(self.to_mongo(),  *args, **kwargs)
  File "/home/lala/whatever/.virtualenvs/whatever/local/lib/python2.7/site-packages/mongoengine/base/document.py", line 255, in to_mongo
value = field.to_mongo(value)
  File "/home/lala/whatever/.virtualenvs/whatever/local/lib/python2.7/site-packages/mongoengine/fields.py", line 739, in to_mongo
reverse=self._order_reverse)
TypeError: 'ObjectId' object has no attribute '__getitem__'

какво правя грешно Бих искал отговорът да е нещо като:

>>> h.to_json()
'{"_id": {"$oid": "54cf8f91b0ab4a2b7c5a71b6"}, "something": {"$oid": "54c20742b0ab4a5e4c08f5c7"}, "otherthings": [ "_id": {"$oid": "54cf8fbeb0ab4a2d35631cf0"}, "_id": {"$oid": "54cf8fc7b0ab4a2bd7abfe78"}, "_id": {"$oid": "54cf8fd3b0ab4a2bda781fd5"}, "_id": {"$oid": "54cf8fd3b0ab4a2b7c5a71b9"}, "_id": {"$oid": "54cf8ffbb0ab4a2fa167f335"}, "_id": {"$oid": "54cf9001b0ab4a2fcc6ae982"}, "_id": {"$oid": "54cf9001b0ab4a2fcc6ae983"}, "_id": {"$oid": "54cf9001b0ab4a3170f6cc00"}, "_id": {"$oid": "54cf9002b0ab4a31566e9837"}, "_id": {"$oid": "54cf9002b0ab4a2ffc13b055"} ] }'

И ако е възможно да се извлекат референтните обекти (dereference?) от ReferenceFields, би било чудесно.


person Jander    schedule 03.02.2015    source източник


Отговори (1)


Някак си намерих решение с помощта на json от Flask:

json.jsonify(
    _id=json.loads(bson.json_util.dumps(h.id)),
    something=json.loads(bson.json_util.dumps(h.something.id)),
    otherthings=json.loads(bson.json_util.dumps(otherthings))
)

и връща структурата, която исках:

{
    "_id": {"$oid": "53c92ecad9da48dcc45e0550"}, 
    "something": {"$oid": "53c8cd3414d0e362765e41a2"}, 
    "otherthings": [
        {"info":1}, 
        {"info":2}, 
        {"info":3}, 
        {"info":4}, 
        {"info":5}, 
        {"info":6}, 
        {"info":7}, 
        {"info":8}, 
        {"info":9}, 
        {"info":10}
    ]
}

Може ли да се оптимизира/подобри?

person Jander    schedule 03.02.2015