Django:在Forgin密钥关系上与众不同



我正在Django的票务/问题跟踪器中,我需要在其中记录每个票证的状态。这是我模型的简化。

class Ticket(models.Model):
    assigned_to = ForeignKey(User)
    comment = models.TextField(_('comment'), blank=True)
    created = models.DateTimeField(_("created at"), auto_now_add=True)
class TicketStatus(models.Model):
    STATUS_CHOICES = (
        (10, _('Open'),),
        (20, _('Other'),),
        (30, _('Closed'),),
    )
    ticket = models.ForeignKey(Ticket, verbose_name=_('ticket'))
    user = models.ForeignKey(User, verbose_name=_('user'))
    status = models.IntegerField(_('status'), choices=STATUS_CHOICES)
    date = models.DateTimeField(_("created at"), auto_now_add=True)

现在,获得票证的状态很容易按日期进行排序,然后检索这样的第一列。

ticket = Ticket.objects.get(pk=1)
ticket.ticketstatus_set.order_by('-date')[0].get_status_display() 

,但是我也希望能够过滤管理员中的状态,而这些状态必须使状态陷入票务 - 票务 - QuerySet,这使其突然变得更加复杂。我将如何获得所有具有一定身份的门票的QuerySet?

我想您正在尝试避免一个周期(要求每个机票状态)以手动过滤QuerySet。据我所知,您无法避免那个周期。这是想法:

# select_related avoids a lot of hits in the database when enter the cycle
t_status = TicketStatus.objects.select_related('Ticket').filter(status = ID_STATUS)
# this is an array with the result
ticket_array = [ts.ticket for ts in tickets_status]

或,由于提到您正在寻找QuerySet,这可能是您正在寻找的

# select_related avoids a lot of hits in the database when enter the cycle
t_status = TicketStatus.objects.select_related('Ticket').filter(status = ID_STATUS)
# this is a QuerySet with the result
tickets = Tickets.objects.filter(pk__in = [ts.ticket.pk for ts in t_status])

但是,问题可能在于您对数据进行建模。您所说的tickedstatus更像是TicketStatusLog,因为您想跟踪用户并更改状态的日期。

因此,合理的方法是在每次创建新的TicketStatus时都会更新的机票模型中添加字段" Current_status"。通过这种方式(1)您不必每次要求票时订购表,(2)您只需在我认为您的要求时做诸如ticket.objects.objects.filter(current_status = id_status)之类的事情。

最新更新