【问题标题】:Django: Distinct on forgin key relationshipDjango:外键关系不同
【发布时间】:2012-10-25 20:43:02
【问题描述】:

我正在 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() 

但是我还希望能够在 Admin 中过滤状态,而那些必须通过 Ticket-queryset 获得状态,这使得它突然变得更加复杂。如何获得具有特定状态的所有票证的查询集?

【问题讨论】:

  • “通过 Ticket-queryset 获取状态”是什么意思?

标签: django distinct django-queryset


【解决方案1】:

我猜你是想避免一个循环(询问每个工单状态)来手动过滤查询集。据我所知,你无法避免那个循环。以下是一些想法:

# 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) 之类的操作。

【讨论】:

    猜你喜欢
    • 2016-07-29
    • 1970-01-01
    • 2013-07-20
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 2018-12-14
    相关资源
    最近更新 更多