在使用烧瓶中的小便查询时,如何删除具有重复条目的行?

时间:2017-09-25 16:38:26

标签: python peewee

我使用烧瓶,小便,sqlite3。对于结算系统,我试图为特定用户创建所有账单的概述。新的账单添加了" bill_number"并且可以有多个订单项。如果账单有多个订单项,则" bill_number"将在数据库中重复。当我查询数据库I时,只想获得显示" bill_number"的第一行。并使用相同的" bill_number"。

跳过其他行
SQlite Database:
| id | bill_number | user_id | description |  price  |
| 1  | 1           | 8       | Logo Design |  250.00 |
| 2  | 2           | 8       | Web Design  |  500.00 |
| 3  | 2           | 8       | Logo Design |  250.00 |
| 4  | 3           | 8       | Web Design  |  550.00 |
| 5  | 4           | 8       | Img Design  |  250.00 |

在我的应用中我喜欢用以下内容查询:

@app.route('/billOverview')
def bill_overview():
  bills = models.Bill.select().where(models.Bill.user_id == current_user.id).deduplicate(models.Bill.bill_number)
  return render_template('bills-overview.html', bills=bills)

这样我就可以轻松地在我的模板中阅读:

{% for bill in bills %}
 view details for <a href="">Bill #{{ bill.bill_number }}</a>
{% endfor %}

呈现的内容类似于:

view details for Bill #1
view details for Bill #2
view details for Bill #3
view details for Bill #4

2 个答案:

答案 0 :(得分:1)

我实际上是自己解决了这个问题。答案比预期容易得多:-)

bills = models.Bill.select().where(models.Bill.user_id == current_user.id).group_by(models.Bill.bill_number)

我一直在寻找 group_by()

答案 1 :(得分:0)

看起来peewee不支持你提到的API。你有几个选择:

  • 使用group by对bill_number列进行重复数据删除,请参阅peewee文档中的this“hack”。
  • 进一步规范化您的架构。此表中不允许有多个(bill_number, user_id)行。创建另一个表(bill_items或其他东西)来存储每个单独的项目。这样,您的select查询将返回您想要的行,您可以加入新表以获取详细视图。