MongoEngine嵌入式文档中的解引用关系

2024-05-16 03:59:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用MongoEngine的模式,看起来像这样

class User(db.Document)
    email = db.EmailField(unique=True)

class QueueElement(db.EmbeddedDocument):
    accepts = db.ListField(db.ReferenceField('Resource'))
    user = db.ReferenceField(User)

class Resource(db.Document):
    name = db.StringField(max_length=255, required=True)
    current_queue_element = db.EmbeddedDocumentField('QueueElement')

class Queue(db.EmbeddedDocument):
    name = db.StringField(max_length=255, required=True)
    resources = db.ListField(db.ReferenceField(Resource))
    queue_elements = db.ListField(db.EmbeddedDocumentField('QueueElement'))

class Room(db.Document):
    name = db.StringField(max_length=255, required=True)
    queues = db.ListField(db.EmbeddedDocumentField('Queue'))

我想返回一个Room对象的JSON对象,该对象将包含关于其队列的信息(连同引用的资源),以及嵌套的queue_元素(连同它们引用的“accepts”引用和用户引用)

但是,当我要返回一个已取消其关系的房间时:

^{pr2}$

我没有得到任何解引用。我得到:

{
   "_cls":"Room",
   "_id":{
      "$oid":"552ab000605cd92f22347d79"
   },
   "created_at":{
      "$date":1428842482049
   },
   "name":"second",
   "queues":[
      {
         "created_at":{
            "$date":1428842781490
         },
         "name":"myQueue",
         "queue_elements":[
            {
               "accepts":[
                  {
                     "$oid":"552aafb3605cd92f22347d78"
                  },
                  {
                     "$oid":"552aafb3605cd92f22347d78"
                  },
                  {
                     "$oid":"552ab1f8605cd92f22347d7a"
                  }
               ],
               "created_at":{
                  "$date":1428849389503
               },
               "user":{
                  "$oid":"552ac8c7605cd92f22347d7b"
               }
            }
         ],
         "resources":[
            {
               "$oid":"552aafb3605cd92f22347d78"
            },
            {
               "$oid":"552aafb3605cd92f22347d78"
            },
            {
               "$oid":"552ab1f8605cd92f22347d7a"
            }
         ]
      }
   ],
   "slug":"secondslug"
}

即使我使用的是select_related()函数。我相信这是因为MongoEngine可能不会遵循嵌入文档的引用。注意,如果我这样做,实际上可以在python中取消引用:

room = Room.objects(slug=slug).first().queues[0].queue_elements[0].accepts[0]
return ast.literal_eval(room.to_json())

它产生了

{
   "_id":{
      "$oid":"552aafb3605cd92f22347d78"
   },
   "created_at":{
      "$date":1428842849393
   },
   "name":"myRes"
}

这显然是被取消引用的资源文档。在

有没有方法可以跟踪嵌入文档的参考资料?或者这是因为我遵循了一个错误的模式,并且应该找到另一种方法来在MongoDB中存储这些信息(或者实际上,切换到关系数据库)?谢谢!在


Tags: nametruedbdatequeuedocumentatclass