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连接?的主要内容,如果未能解决你的问题,请参考以下文章