Peewee ORM中如何选择和限制related_name连接?

Posted

技术标签:

【中文标题】Peewee ORM中如何选择和限制related_name连接?【英文标题】:How to select and limit the related_name connection in the Peewee ORM? 【发布时间】:2013-11-21 11:29:45 【问题描述】:

我将 Flask 与 Peewee ORM 一起使用,我在其中定义了两个表,如下所示:

class Ticket(db.Model):
    created = DateTimeField(default=datetime.now)
    customer_uuid = CharField() # the customer's UUID gotten from App. More info comes from bunq API.
    ticket_type = ForeignKeyField(TicketType, related_name='tickets')
    active = BooleanField(default=True)

class Assign(db.Model):
    created = DateTimeField(default=datetime.now)
    ticket = ForeignKeyField(Ticket, related_name='assigned_to')
    user = ForeignKeyField(User, related_name='assigned_tickets')

在分配表中,可以将多个用户分配给一个工单,但只计算最后一个(即,如果分配了新用户,则应忽略之前的用户)。因此,我使用以下方法选择有效票证:

open_tickets = Ticket.select().where(Ticket.active == True)

我现在想在我的模板中使用这个循环。但是,对于每次迭代,我还想显示分配的用户。但是open_ticket[0].assigned_to 显然返回了几个分配,并带有几个用户。

有人知道我如何为循环中的每张工单获取最新分配的用户吗?

【问题讨论】:

如果票证一次只能分配给一个用户,为什么不在票证表中将user_id 作为 FK? @Doobeh - 因为我希望能够看到它之前分配给了哪个。通过这种方式,我可以看到工单发生了什么以及为什么,例如,有人被分配到它,但将其更改为不同的用户。 对我来说最好的方法是在分配中添加某种活动标志,在分配创建(插入/更新)时发出信号以停用以前的分配,然后查询将非常简单(赋值.active == True) 【参考方案1】:

这在 Sqlite 中对我有用:

q = (Ticket
     .select(Ticket, Assign, User)
     .join(Assign)
     .join(User)
     .group_by(Ticket)
     .order_by(Ticket.id, Assign.id.desc()))

for ticket in q:
    print ticket.id, ticket.assign.user.username

【讨论】:

以上是关于Peewee ORM中如何选择和限制related_name连接?的主要内容,如果未能解决你的问题,请参考以下文章

peewee的使用 python orm

返回peewee ORM中分组项目的计数

Python ORM框架之 Peewee入门

Peewee显示在ORM表中最多出现的项目(计算)

python-轻量级ORM库peewee的使用

python-轻量级ORM库peewee的使用