一边做项目,一边做笔记的。这习惯不好,做项目的时候,不酣畅,但我 一做完项目就忘了,其中的想法。回头也找不出头绪了。
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 就不会变了 。