[英]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']
每張票證都有一個(至少)或多個與票務更新相關的信息。
我想要:
我不確定是否必須在票證或票證更新上進行查詢。
我什至不確定我是否需要在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')
返回所有現有票證,因為它們都具有初始的“新”狀態。 我保留了票證的整個歷史記錄: New , Working , Fixed , NotFixed , Working (再次是“ 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.