簡體   English   中英

Django-對外鍵進行排序和過濾

[英]Django - Order and filter on Foreign Key

在像這樣的模型上對ForeignKey鍵進行排序和過濾的正確方法是什么?

class Ticket(models.Model):
    name = models.CharField(max_length=250)
    created_time = models.DateTimeField(auto_now_add=True)

    def current(self):
        return TicketUpdate.objects.filter(ticket=self.id).first()

class TicketUpdate(models.Model):
    ticket = models.ForeignKey(Ticket)
    description = models.TextField()
    status = models.CharField(max_length=1, choices=STATUSES, default='N')
    type = models.CharField(max_length=1, choices=TYPES, default='N')
    priority = models.CharField(max_length=1, choices=PRIORITIES, default='D')
    created_time = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_time']

每張票證都有一個(至少)或多個與票務更新相關的信息。

我想要:

  • 列出票證中的所有票證並顯示其當前狀態(最新的票證更新項)
  • 通過TicketUpdate__created_timeTicket__created_time訂購列表
  • TicketUpdate__priorityTicketUpdate__typeTicketUpdate__status篩選列表

我不確定是否必須在票證或票證更新上進行查詢。

我什至不確定我是否需要在Ticket模型上使用current()函數:我在ListView上使用它來檢索TicketUpdate信息。

Ticket.objects.all().order_by('ticketupdate__created_time')

我得到了訂購的清單,但條目過多。

一切也必須在sqlite3 db上運行。

編輯:此過濾器查詢集

Ticket.objects.filter(ticketupdate__status='New').values('name', 'ticketupdate__status').order_by('ticketupdate__created_time')

返回所有現有票證,因為它們都具有初始的“新”狀態。 我保留了票證的整個歷史記錄: NewWorkingFixedNotFixedWorking (再次是“ Working”:該修復程序無效,用戶重新打開了票證)

因此,我只想按最新狀態過濾:我需要所有“ 工作”狀態,但是如果票證同時具有“工作”狀態和“固定”狀態怎么辦? 我只需要篩選最新的。

是的,您真的不需要那種當前方法。

您可以只獲取查詢集並獲取第一項。

Ticket.objects.all().order_by('ticketupdate__created_time')[0]

或者采用更基於django的方法;

Ticket.objects.all().latest('ticketupdate__created_time')

而且,如果您想過濾事物;

Ticket.objects.filter(ticketupdate__status='status').order_by(
    'ticketupdate__created_time')

Ticket.objects.filter(ticketupdate__priority='high').latest(
    'ticketupdate__created_time')

你可以試試:

用於列出票證中的所有票證並顯示其當前狀態(最新的票證更新項目):

對於列表:

Ticket.objects.values('name', 'ticketupdate__status')

對於最新的票證更新對象:

TicketUpdate.objects.latest('ticket__created_time')

要在TicketUpdate__created_time或Ticket__created_time之前訂購列表:

Ticket.objects.values('name', 'ticketupdate__status').order_by('ticketupdate__created_time')

要么

Ticket.objects.values('name', 'ticketupdate__status').order_by('created_time')

要按TicketUpdate__priority或TicketUpdate__type或TicketUpdate__status篩選列表:

Ticket.objects.filter(ticketupdate__status='your status choice').values('name', 'ticketupdate__status').order_by('ticketupdate__created_time') # simillary priority

編輯

如我所見, TicketUpdate中的status字段是一個字符字段,因此TicketUpdate對象不能同時具有Working狀態或New狀態。 如果要獲取最近更新/創建的對象,請考慮將auto_now添加到字段created_time並在每次使用以下方法查詢時添加:

Ticket.objects.filter(ticketupdate__status='New').values('name', 'ticketupdate__status').order_by('ticketupdate__created_time')

您將獲得按此順序排序的列表,以使最后更新/創建的對象成為該列表的第一個索引。 也:

Ticket.objects.filter(ticketupdate__status='New').values('name', 'ticketupdate__status').order_by('ticketupdate__created_time').first()

將返回最新的Ticket數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM