Flask 从QuerySelectField中删除重复项

Flask 从QuerySelectField中删除重复项,flask,flask-sqlalchemy,flask-wtforms,flask-admin,Flask,Flask Sqlalchemy,Flask Wtforms,Flask Admin,我遇到了以下问题,我想知道这是否可能 我有一个flask admin adminview设置,带有一个额外的表单字段,该字段显示基于sql模型中特定列类别的下拉列表。有关说明,请参见代码: 型号: class Item(db.Model): id = db.Column(db.Integer, primary_key = True) name = db.Column(db.String(128), index = True) category = db.Column(db

我遇到了以下问题,我想知道这是否可能

我有一个flask admin adminview设置,带有一个额外的表单字段,该字段显示基于sql模型中特定列类别的下拉列表。有关说明,请参见代码:

型号:

class Item(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(128), index = True)
    category = db.Column(db.String(16))
我在Flask Admin中有额外的表单字段,如下所示:

    form_extra_fields = {
    'category': QuerySelectField(
        label='Categories',
        query_factory = lambda: db.session.query(Item),
        get_label = 'category',
        )
    }

这一切都可以正常工作,除非“类别”列中存在重复项,然后用这些重复值填充下拉列表。是否可以从下拉列表中删除这些重复项,或者至少只显示唯一值?

基本上,我解决了这个问题,方法是覆盖QuerySelectField类中的类方法,如下所示,将唯一标签附加到列表中,并检查下一个标签是否都在该列表中。我仍然在想应该有更好的办法

def iter_choices(self):
    labels = []     
    if self.allow_blank:           
        yield ('__None', self.blank_text, self.data is None)        

    for pk, obj in self._get_object_list():      

    if self.get_label(obj) not in labels:                        

        labels.append(self.get_label(obj))                
        yield (pk, self.get_label(obj), obj == self.data) 

基本上,我通过如下方式重写QuerySelectField类中的一个类方法解决了这个问题:将唯一标签附加到列表中,并检查下一个标签是否都在该列表中。我仍然在想应该有更好的办法

def iter_choices(self):
    labels = []     
    if self.allow_blank:           
        yield ('__None', self.blank_text, self.data is None)        

    for pk, obj in self._get_object_list():      

    if self.get_label(obj) not in labels:                        

        labels.append(self.get_label(obj))                
        yield (pk, self.get_label(obj), obj == self.data) 

我不知道它如何适合这样一个评论,但如果你只选择不同的类别呢?类似db.session.querydistinctItem.categoryHi的内容,感谢您的输入。自从我的帖子发布以来,我已经测试了各种不同的格式,但还不是你的建议。但不幸的是,它会导致以下错误:sqlalchemy.orm.exc.unappedinstanceerror:Class'sqlalchemy.util.\u collections.result'未映射。从这个错误中我了解到,查询工厂无法返回列。是否可以删除get_标签部分中的重复项?这似乎给出了我在sqlite数据库中寻找的结果:db.session.queryItem.group_byItem.category。在MySQL生产数据库上,它返回一个错误:sqlalchemy.exc.InternalError:pymysql.err.InternalError 1055,SELECT列表的表达式1不在GROUP BY子句中,并且包含未聚合的列,该列似乎与错误消息的internet搜索中发现的MySQL设置仅_FULL_GROUP_BY相关。我希望这会有帮助,或者让你找到正确的任务。我无法提供MySQL的帮助。是的,正在调查。我理解错误发生的原因,但是看看,在更改查询时应该有一个解决方案。但是我找不到sqlalchemy这样做的方法。我不知道它如何适合这样一个评论,但是如果你只选择不同的类别呢?类似db.session.querydistinctItem.categoryHi的内容,感谢您的输入。自从我的帖子发布以来,我已经测试了各种不同的格式,但还不是你的建议。但不幸的是,它会导致以下错误:sqlalchemy.orm.exc.unappedinstanceerror:Class'sqlalchemy.util.\u collections.result'未映射。从这个错误中我了解到,查询工厂无法返回列。是否可以删除get_标签部分中的重复项?这似乎给出了我在sqlite数据库中寻找的结果:db.session.queryItem.group_byItem.category。在MySQL生产数据库上,它返回一个错误:sqlalchemy.exc.InternalError:pymysql.err.InternalError 1055,SELECT列表的表达式1不在GROUP BY子句中,并且包含未聚合的列,该列似乎与错误消息的internet搜索中发现的MySQL设置仅_FULL_GROUP_BY相关。我希望这会有帮助,或者让你找到正确的任务。我无法提供MySQL的帮助。是的,正在调查。我理解错误发生的原因,但是看看,在更改查询时应该有一个解决方案。但我找不到炼金术的方法。