我正在研究django中的Ticket / Issue-tracker,我需要记录每张票的状态。这是我模型的简化。
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()
但是我还希望能够在Admin中过滤状态,并且必须通过Ticket-queryset获取状态,这使得它突然变得更加复杂。如何获得具有特定状态的所有故障单的查询集?
答案 0 :(得分:0)
我猜你试图避免一个循环(要求每个故障单状态)手动过滤查询集。据我所知,你无法避免这种循环。以下是想法:
# 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时更新的Ticket模型中添加一个字段'current_status'。通过这种方式(1)您不必在每次要求票证时订购表格,(2)您只需按照Ticket.objects.filter(current_status = ID_STATUS)执行我认为您要求的内容。