Python SqlAlchemy按钮逻辑,从真变为无变为假
我希望能得到一些帮助。我相信我的逻辑是有缺陷的 我有一个应用程序,您可以根据搜索后的相关性对不同的文章进行评级。切换按钮是相关的和不相关的。这是为了确定特定文章是否与搜索相关、与搜索无关或未确定 按钮的基本功能: 当无按钮被选中时:Python SqlAlchemy按钮逻辑,从真变为无变为假,python,flask-sqlalchemy,Python,Flask Sqlalchemy,我希望能得到一些帮助。我相信我的逻辑是有缺陷的 我有一个应用程序,您可以根据搜索后的相关性对不同的文章进行评级。切换按钮是相关的和不相关的。这是为了确定特定文章是否与搜索相关、与搜索无关或未确定 按钮的基本功能: 当无按钮被选中时: 用户单击相关->设置RelevantFlag.state为True 用户单击不相关->设置RelevantFlag.state为False 选择相关按钮时: 用户单击相关->设置RelevantFlag.state至None 用户单击不相关->设置Releva
- 用户单击相关->设置
为TrueRelevantFlag.state
- 用户单击不相关->设置
为FalseRelevantFlag.state
- 用户单击相关->设置
至NoneRelevantFlag.state
- 用户单击不相关->设置
为FalseRelevantFlag.state
- 用户单击相关->设置
为TrueRelevantFlag.state
- 用户单击不相关->设置
至NoneRelevantFlag.state
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()
,那么我就可以为你节省很多时间来找出一个准确的数字。它们是两个不同的对象——我认为这会把你的查询搞砸