Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django mongoengine知道何时删除文档_Django_Mongodb_Django Models_Django Views_Mongoengine - Fatal编程技术网

Django mongoengine知道何时删除文档

Django mongoengine知道何时删除文档,django,mongodb,django-models,django-views,mongoengine,Django,Mongodb,Django Models,Django Views,Mongoengine,刚到django。我正在尽最大努力使用Django、mongodb和mongoengine实现CRUD。我能够查询数据库并使用数据库中的正确信息呈现我的页面。我还能够使用javascript更改一些文档字段,并使用正确的csrf标记向原始Django视图类发回Ajax帖子 我来回发送的数据负载是序列化为json的每个文档模型(VirtualPageModel)的列表(每个元素包含ObjectId字符串以及模型中的其他特定字段) 这就是它开始变得模糊的地方。为了在我的视图类post函数中更新原始文

刚到django。我正在尽最大努力使用Django、mongodb和mongoengine实现CRUD。我能够查询数据库并使用数据库中的正确信息呈现我的页面。我还能够使用javascript更改一些文档字段,并使用正确的csrf标记向原始Django视图类发回Ajax帖子

我来回发送的数据负载是序列化为json的每个文档模型(VirtualPageModel)的列表(每个元素包含ObjectId字符串以及模型中的其他特定字段)

这就是它开始变得模糊的地方。为了在我的视图类post函数中更新原始文档,我使用对象id执行额外的查询,并循环遍历字典项,每次设置相应的字段。然后我调用save,所有新数据都被正确地推送到Mongo集合

我不确定我所做的更新现有文档的工作是否正确,或者是否符合django抽象数据库操作的精神。越是深入,我就越觉得我之前没有使用一些基础设施(由django或mongoengine提供),正因为如此,我不得不在下游进一步补充

按照我现在的代码方式,我将无法创建新文档(尽管这很容易修复)。然而,我真正好奇的是,我如何知道何时删除一个存在于初始查询中但被用户/javascript代码删除的文档?我是不是想得太多了,我的帖子的内容应该包含一个要删除的objectid列表(听起来像是一个安全风险,尽管这是一个内部工具。)

我假设我的视图类可能会维护它查询的原始文档对象(或仅仅是objectid),并且我可以从该集合中进行比较,但我似乎无法从它的开始到我在最后收到帖子时将这些信息保留下来(作为VolumeSplitterView中的类变量)

如果有人能看看我的代码,我将不胜感激。当Django与Mongo和/或一个足够复杂的模型模式结合使用时,它的“易用性”功能似乎真的开始崩溃,这需要javascript直接使用,而不是简单的表单

我打算利用这项开发工作,成为django的硬汉,以应对未来更加复杂和重要的应用程序。我可以整天对这个东西进行黑客攻击并使其功能化,但我真正感兴趣的是任何人使用Django+MongoDB+MongoEngine在一个不以形式为中心的数据库模式上实现CRUD的经验(请考虑更多的嵌套元数据)

谢谢

model.py:使用mongoengine字段类型

class MongoEncoder(JSONEncoder):
def默认值(自身,o):
如果是实例(o,VirtualPageModel):
data_dict=(o.to_mongo())。to_dict()
如果isinstance(数据目录获取(“id”),ObjectId):
数据目录更新({u id':str(数据目录获取({u id')))
返回数据
其他:
返回JSONEncoder.default(self,o)
类模型(嵌入文档):
filename=StringField(最大长度=200,必需=True)
page_num=IntField(必需=True)
类VirtualPageModel(文档):
体积=StringField(最大长度=200,必需=真)
开始\u物理\u页面\u num=IntField()
物理页面=列表字段(嵌入式文档字段(子模型),
默认值=列表)
错误\u msg=ListField(StringField(),
默认值=列表)
def保存(自身、*args、**kwargs):
打印('In save:{}'。格式(kwargs))
对于k,v在kwargs.items()中:
如果k=='physical_pages':
self.physical_页面=[]
对于v中的_页面:
tmp_pp=子模型()
对于p_k,p_v在a_页面中。items():
设置属性(tmp_pp、p_k、p_v)
self.physical\u pages.append(tmp\u pp)
其他:
setattr(自、k、v)
返回super(VirtualPageModel,self).save(*args,**kwargs)
views.py:我在视图中的尝试

class VolumeSLitterView(视图):
#initial={'key':'value'}
模板名称='单击模型/index.html'
vol=无
开始=0
结束=20
def get(自我、请求、*args、**kwargs):
self.vol=self.kwargs.get('vol',无)
records=self.get_records()
记录=记录[self.start:self.end]
vp_json_列表=[]
img_文件路径=[]
对于记录中的vp:
vp_json=json.dumps(vp,cls=MongoEncoder)
vp_json_list.append(vp_json)
对于vp.physical_页面中的pp:
filepath=获取文件路径(vp,pp.filename)
img_filepath.append(filepath)
数据记录={
“img_文件路径”:img_文件路径,
“vp_json_列表”:vp_json_列表
}
返回render\u to\u响应(self.template\u名称,
{'data_dict':data_dict},
请求上下文(请求)
def get_记录(自):
返回VirtualPageModel.objects(volume=self.vol)
def post(自我、请求、*args、**kwargs):
如果request.is_ajax:
vp_dict_list=json.load(request.POST.get('data',[]))
对于vp_目录列表中的vp_目录:
o_id=vp_dict.pop(“_id”)
原始文档=VirtualPageModel.objects.get(id=o\u id)
尝试:
原始文档保存(**副总裁)
除例外情况外:
打印(traceback.format_exc())