Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.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
Python SqlAlchemy按钮逻辑,从真变为无变为假_Python_Flask Sqlalchemy - Fatal编程技术网

Python SqlAlchemy按钮逻辑,从真变为无变为假

Python SqlAlchemy按钮逻辑,从真变为无变为假,python,flask-sqlalchemy,Python,Flask Sqlalchemy,我希望能得到一些帮助。我相信我的逻辑是有缺陷的 我有一个应用程序,您可以根据搜索后的相关性对不同的文章进行评级。切换按钮是相关的和不相关的。这是为了确定特定文章是否与搜索相关、与搜索无关或未确定 按钮的基本功能: 当无按钮被选中时: 用户单击相关->设置RelevantFlag.state为True 用户单击不相关->设置RelevantFlag.state为False 选择相关按钮时: 用户单击相关->设置RelevantFlag.state至None 用户单击不相关->设置Releva

我希望能得到一些帮助。我相信我的逻辑是有缺陷的

我有一个应用程序,您可以根据搜索后的相关性对不同的文章进行评级。切换按钮是相关的和不相关的。这是为了确定特定文章是否与搜索相关、与搜索无关或未确定

按钮的基本功能:

按钮被选中时:

  • 用户单击相关->设置
    RelevantFlag.state
    True
  • 用户单击不相关->设置
    RelevantFlag.state
    False
选择相关按钮时:

  • 用户单击相关->设置
    RelevantFlag.state
    None
  • 用户单击不相关->设置
    RelevantFlag.state
    False
当选择了不相关的按钮时:

  • 用户单击相关->设置
    RelevantFlag.state
    True
  • 用户单击不相关->设置
    RelevantFlag.state
    None
每次用户单击按钮时,将添加一条新的
RelevantFlag
记录。选择相关按钮,然后再次选择该按钮将关闭该按钮。例如,按两次相关键并打印出记录:

当用户点击相关3次时,记录应为:

相反,我得到了

下面是我正在使用的模型类:

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    def mark_relevant(self, research, article):
        # If nothing is selected OR
        # NotRelevant is selected, set True state
        if (not self.has_marked_relevant(research, article) or
            self.has_marked_not_relevant(research, article)):
            relevant = RelevantFlag(
                user_id=self.id,
                research_id=research.id,
                article_id=article.id,
                state=True
            )
            db.session.add(relevant)

        # If Relevant already selected, set back to None
        elif self.has_marked_relevant(research, article):
            relevant = RelevantFlag(
                user_id=self.id,
                research_id=research.id,
                article_id=article.id,
                state=None
            )
            db.session.add(relevant)

    def mark_not_relevant(self, research, article):
        # If nothing is selected OR
        # Relevant is selected, set False state
        if (not self.has_marked_not_relevant(research, article) or
            self.has_marked_relevant(research, article)):
            not_relevant = RelevantFlag(
                user_id=self.id,
                research_id=research.id,
                article_id=article.id,
                state=False
            )
            db.session.add(not_relevant)

        # If Not Relevant already selected, set back to None
        elif self.has_marked_not_relevant(research, article):
            not_relevant = RelevantFlag(
                user_id=self.id,
                research_id=research.id,
                article_id=article.id,
                state=None
            )
            db.session.add(not_relevant)

    def has_marked_relevant(self, research, article):
        return RelevantFlag.query.filter(
            RelevantFlag.user_id == self.id,
            RelevantFlag.research_id == research.id,
            RelevantFlag.article_id == article.id,
            RelevantFlag.state).count() > 0

    def has_marked_not_relevant(self, research, article):
        return RelevantFlag.query.filter(
            RelevantFlag.user_id == self.id,
            RelevantFlag.research_id == research.id,
            RelevantFlag.article_id == article.id,
            RelevantFlag.state == False).count() > 0
以及相关的Flag模型

class RelevantFlag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    article_id = db.Column(db.Integer, db.ForeignKey('article.id'))
    state = db.Column(db.Boolean)

    def __repr__(self):
        return '<Relevant: {0}:{1}>'.format(
            self.user_id,
            self.state
            )
类相关标志(db.Model):
id=db.Column(db.Integer,主键=True)
user\u id=db.Column(db.Integer,db.ForeignKey('user.id'))
article_id=db.Column(db.Integer,db.ForeignKey('article.id'))
state=db.Column(db.Boolean)
定义报告(自我):
返回“”格式(
self.user\u id,
自我状态
)

我被困在如何合并两个按钮切换,创建不同状态的记录。任何指导都将不胜感激

带有标记的方法似乎与整个历史记录相关,而不是按钮的当前状态。那是故意的吗?啊,那不是故意的。我的问题似乎在于
已标记方法在标记记录上设置时间戳并选择最近的?如果将
.count()>0
替换为
.exists()
,则更容易、更快。如果我让你数一数海滩上的沙粒,只是想知道是否有沙粒?如果我只是告诉你一旦发现一个grainTry将
RelevantFlag.state==False
替换为
RelevantFlag.state==sqlalchemy.False()
,那么我就可以为你节省很多时间来找出一个准确的数字。它们是两个不同的对象-我认为这会把你的查询搞砸
标记了.*
方法似乎与整个历史相关,而不是按钮的当前状态。那是故意的吗?啊,那不是故意的。我的问题似乎在于
已标记方法在标记记录上设置时间戳并选择最近的?如果将
.count()>0
替换为
.exists()
,则更容易、更快。如果我让你数一数海滩上的沙粒,只是想知道是否有沙粒?如果我只是告诉你一旦发现一个grainTry将
RelevantFlag.state==False
替换为
RelevantFlag.state==sqlalchemy.False()
,那么我就可以为你节省很多时间来找出一个准确的数字。它们是两个不同的对象——我认为这会把你的查询搞砸