0

我创建了 2 个单独的模型文件,分别称为“主题”和“子主题”。我的子主题模型类导入主题类,因为没有主题就无法创建子主题。在我尝试添加删除主题的功能之前,这一切都很好。

在删除主题之前,我必须检查所选主题是否有任何子主题,以及是否确实避免用户删除该主题。所以为了实现这一点,我必须在“主题”中导入“子主题”类,以检查用户尝试删除的主题是否存在子主题。

这会导致应用程序崩溃,因为“子主题”已经导入“主题”,因此通过在“主题”中导入“子主题”会创建 ImportError。

如何解决这个问题?我喜欢将每个模型放在单独的类中,以提高可读性和简洁性。

这是我的目录列表,

/
model/
  Topic.py
  SubTopic.py
run.py

请在下面找到代码,

主题.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'

子主题.py

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'

先谢谢了,

4

3 回答 3

1

不导入子主题,或不导入主题。例如,要检查主题是否有任何子主题,检查子列表是否为空就足够了。Python 的鸭子类型意味着您不需要导入即可访问对象的方法。如果您发布代码,我可以更具体。

于 2014-08-18T02:51:50.140 回答
0

如果您寻找代码的快速解决方案,您可以导入QuestionSubTopic在删除方法中:

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
于 2014-08-18T14:51:16.537 回答
0

只需添加__init__.py模型folder

于 2014-08-19T01:24:05.310 回答