[英]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.