Как выбрать и ограничить соединение related_name в Peewee ORM?

Я использую 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')

В таблице Assign на заявку может быть назначено несколько пользователей, но учитывается только последний (т. е. если назначается новый пользователь, предыдущие не учитываются). Поэтому я выбираю активные билеты, используя следующее:

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

Теперь я хочу использовать этот цикл в своем шаблоне. Однако с каждой итерацией я также хочу отображать назначенного пользователя. Но open_ticket[0].assigned_to явно возвращает несколько назначений, а с ним и несколько пользователей.

Кто-нибудь знает, как я могу получить последнего назначенного пользователя для каждого билета в цикле?


person kramer65    schedule 21.11.2013    source источник
comment
Если заявка может быть назначена только одному пользователю за раз, почему бы не использовать user_id в качестве FK в таблице заявок?   -  person Doobeh    schedule 22.11.2013
comment
@Doobeh - потому что я хочу видеть, кому он был назначен раньше. Таким образом я могу увидеть, что случилось с тикетом и почему, например, кто-то был назначен на него, но изменил его на другого пользователя.   -  person kramer65    schedule 22.11.2013
comment
Самый лучший способ сделать это для меня - добавить какой-то активный флаг к назначению, сигнал о создании назначения (вставка/обновление), чтобы деактивировать прежние назначения, и тогда запрос будет очень простым (Assign.active == True)   -  person Paweł Pogorzelski    schedule 22.11.2013


Ответы (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
person coleifer    schedule 25.11.2013