mongoengine 学习 笔记

一边做项目,一边做笔记的。这习惯不好,做项目的时候,不酣畅,但我 一做完项目就忘了,其中的想法。回头也找不出头绪了。

1:

 创建model (整个项目的部署 如同django)   有:setting,url,model,views

import mongoengine as models

class
Project(models.Document): pass class Respondent(models.DynamicDocument): pass

这里的Docment.DynamicDocument.区别在于DynamicDocument可扩展.respondente的动态属性也会保存.而project的动态属性会报错。

http://docs.mongoengine.org/en/latest/apireference.html?highlight=dynamicdocument#mongoengine.DynamicDocument   更多model 不过我觉得 这2个model就够用了 。

 

2:

class Question(models.Document):
      option_list = models.ListField(models.ReferenceField('Option'))

创建question的时候,是将所有的option都做好,拼成一个list  option_list.然后直接  question.option_list = option_list .

这么做得好处是:当添加修改功能的时候。直接相同的页面,相同的代码。 避免了,通过id 取出question.option_list中特定的list然后修改list这样代码量增加 好多,Ajax。传递,option修改。或许还要添加前台的html页面。   (现在做页面的时候,尽量用ajax 尽量页面:为3个层次)

3:

class Question(models.Document):
    option_list = models.ListField(models.ReferenceField('Option'))

class Option(models.Document):
    jump_to = models.ReferenceField('Question')

这个2个model相互引用,也不可以 。django model中mysql 不可以相互引用。nosql 竟然也不可以。看来我对nosql 不熟悉。

4:

class Project(models.Document):    
   question_list = models.ListField(models.ReferenceField('Question')) @property
def to_dict(self): return dict(question_list = [question.to_dict for question in self.question_list],) class Question(models.Document): option_list = models.ListField(models.ReferenceField('Option')) @property def to_dict(self): return dict(id = self.oid,option_list = [option.to_dict for option in self.option_list], ) class Option(models.Document): jump_to = models.ReferenceField('Question')
   @
property
   def jump_to_question(self):
return self.jump_to.oid if self.jump_to else None
   @property

def to_dict(self): return dict( jump_to = self.jump_to_question, )

这3个model中 project.to_dict 将所有的project的信息提取出来。

但遇到一个问题。当     json.dump(project.to_dict) 的时候 无法解析,估计就是json无法递归解析吧。就写了一个函数,jump_to_question 返回 question的id就行了。

 

5:今天遇到mongoengine的一个大问题。(mongoengine   0.7.9)

   a = xx.objects(xx=xx)  或者 a = xx.objects().filter(xx=xx)   

   每次使用a 的时候,都会从数据库中读。每次使用a   a的值都可能会变。

   这 尼玛  太坑爹了。 

   可以 先  使用 list()将其转化,那么 第二次使用的时候,a 就不会变了 。

    

 

 

posted on 2013-03-27 09:27  tiger4py  阅读(903)  评论(0)    收藏  举报

导航