Model 恐怖分子
我创建了两个单独的模型文件,分别称为“主题”和“子主题”。我的子主题模型类导入主题类,因为没有主题无法创建子主题。在我尝试添加删除主题的功能之前,这一切都非常有效 在删除主题之前,我必须检查所选主题是否有子主题,以及是否有子主题,以避免用户删除主主题。因此,为了实现这一点,我必须在“Topic”中导入“SubTopic”类,以检查用户试图删除的主题是否存在子主题 这会导致应用程序崩溃,因为“子主题”已导入“主题”,因此通过导入“主题”内的“子主题”创建了ImportError 如何解决这个问题?为了可读性和清洁性,我喜欢将每个模型保存在单独的类中 这是我的目录列表Model 恐怖分子,model,flask,flask-admin,Model,Flask,Flask Admin,我创建了两个单独的模型文件,分别称为“主题”和“子主题”。我的子主题模型类导入主题类,因为没有主题无法创建子主题。在我尝试添加删除主题的功能之前,这一切都非常有效 在删除主题之前,我必须检查所选主题是否有子主题,以及是否有子主题,以避免用户删除主主题。因此,为了实现这一点,我必须在“Topic”中导入“SubTopic”类,以检查用户试图删除的主题是否存在子主题 这会导致应用程序崩溃,因为“子主题”已导入“主题”,因此通过导入“主题”内的“子主题”创建了ImportError 如何解决这个问题?
/
model/
Topic.py
SubTopic.py
run.py
请在下面找到代码
Topic.py
import datetime
import uuid
import os
# from model.Questions import Questions ---- > ImportError
# from model.SubTopics import SubTopics -----> ImportError
from app import db
from flask.ext.admin.contrib.mongoengine import ModelView
from flask.ext.login import current_user
from Users import User
from flask import request, flash
from constants import *
from wtforms.fields import FileField
from flask.ext.admin.model.template import macro
from wtforms.validators import ValidationError
class Topics(db.Document):
topicName = db.StringField(required=True)
haveSubtopics = db.BooleanField()
image = db.StringField()
createdBy = db.ReferenceField(User)
updatedBy = db.ReferenceField(User)
createdDate = db.DateTimeField(default=datetime.datetime.now())
def get_all_topics(self):
topicList = Topics.objects.all()
if(topicList):
return topicList
else:
return None
def get_topic(self, id):
topic = Topics.objects.get(pk=id)
if(topic):
return topic
else:
return None
def __unicode__(self):
return self.topicName
def delete(self):
dataCnt = 0
if self.haveSubtopics:
dataCnt = SubTopics.objects(mainTopic=self.pk).count() ---> Check sub topic exits before delete
else:
dataCnt = Questions.objects(topic=self.pk).count() ----> Check questions exits before delete
if dataCnt > 0:
flash('Cannot delete this topic. Questions or sub topic exists under this topic')
return False
else:
if not self.image is None:
if os.path.isfile(self.image):
os.unlink(self.image)
self.delete()
return True
class TopicsView(ModelView):
def is_accessible(self):
if current_user.is_authenticated():
return True
else:
return False
column_list = ('topicName','createdDate','haveSubtopics')
column_labels = dict(topicName='Topic', createdDate='Created Date', haveSubtopics='Sub Topics')
form_excluded_columns = ('createdBy','createdDate', 'updatedBy')
create_template = 'create_topic_form.html'
edit_template = 'edit_topic_form.html'
list_template = 'list_topics.html'
副主题
import datetime
from app import db
from model.Topics import Topics
from flask.ext.admin.contrib.mongoengine import ModelView
from flask.ext.login import current_user
from Users import User
from constants import *
from flask import request
from wtforms.validators import ValidationError
from flask.ext.admin.model.template import macro
class SubTopics(db.Document):
subTopicName = db.StringField(required=True)
mainTopic = db.ReferenceField(Topics, required=True)
createdBy = db.ReferenceField(User, required=True)
createdDate = db.DateTimeField(default=datetime.datetime.now())
def get_all_subtopics(self, topicid):
subTopicList = SubTopics.objects(mainTopic=topicid)
if(subTopicList):
return subTopicList
else:
return None
def __unicode__(self):
return self.subTopicName
class SubTopicsView(ModelView):
def is_accessible(self):
if current_user.is_authenticated():
return True
else
return False
column_list = ('subTopicName','mainTopic', 'createdDate')
column_labels = dict(subTopicName='Name', mainTopic='Topic', createdDate = 'Created Date')
form_excluded_columns = ('createdBy','createdDate')
def check_mainTopic(self, form):
topi = request.form['mainTopic']
topicObj = Topics.objects.with_id(topi)
if topicObj:
if not topicObj.haveSubtopics:
raise ValidationError('Selected topic cannot have sub topics')
form_args = dict(
subTopicName=dict(label='Name'),
mainTopic=dict(label='Topic', validators = [check_mainTopic])
)
list_template = 'list_sub_topics.html'
在advanced中感谢,不要导入子主题,或者不要导入主题。例如,要检查主题是否有子主题,您只需检查子主题列表是否为空即可。Python的duck类型意味着您不需要导入来访问对象的方法。如果你发布你的代码,我可以更具体。如果你想快速解决你的代码,你可以导入
问题和副标题内部删除方法:
def delete(self):
import model
dataCnt = 0
if self.haveSubtopics:
dataCnt = model.SubTopics.objects(mainTopic=self.pk).count()
else:
dataCnt = model.Questions.objects(topic=self.pk).count()
if dataCnt > 0:
flash('Cannot delete this topic. Questions or sub topic exists under this topic')
return False
else:
if not self.image is None:
if os.path.isfile(self.image):
os.unlink(self.image)
self.delete()
return True
只需在model文件夹中添加\uuuu init\uuuu.py
,我认为这是关于python导入的一般问题。顺便说一句,编写代码片段将有助于引入更好的解决方案,并且您可以始终使用依赖项注入来避免这些问题。我已使用代码示例编辑了我的问题。我强烈建议您阅读此问答,并重新考虑为什么要将代码拆分为两个模块,而这两个模块紧密结合在一起。