0

私は、各チケットのステータスをログに記録する必要がある 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() 

しかし、管理者でステータスをフィルタリングできるようにしたいのですが、チケットクエリセットを介してステータスを取得する必要があるため、突然複雑になります。特定のステータスのすべてのチケットを含むクエリセットを取得するにはどうすればよいですか?

4

1 に答える 1

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]

または、クエリセットを探していると述べたので、これが探しているものかもしれません

# 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.filter(current_status = ID_STATUS) のようなことをするだけです。

于 2012-11-06T04:26:04.507 に答える