在像这样的模型上订购和过滤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。
我想:
我不确定是否必须在Ticket或TicketUpdate上创建Queryset。
我甚至不确定我是否需要Ticket模型上的 current()函数:我在ListView上使用它来检索TicketUpdate信息。
用
Ticket.objects.all().order_by('ticketupdate__created_time')
我订购了一个列表,但条目太多了。
所有内容也必须在sqlite3数据库上运行。
修改 此过滤器查询集
Ticket.objects.filter(ticketupdate__status='New').values('name', 'ticketupdate__status').order_by('ticketupdate__created_time')
返回所有现有故障单,因为它们都具有初始状态。我保留了一张票的全部历史:新,工作,固定,未固定,工作< / strong>(再次“正在工作”:该修复无效,用户重新打开故障单)
所以我想根据最新状态进行过滤:我需要所有工作但是如果票证同时具有工作和固定状态会怎么样?我只需要过滤最新的。
答案 0 :(得分:0)
是的,你真的不需要当前的方法。
您可以获取查询集并获取第一项;
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')
答案 1 :(得分:0)
您可以尝试:
列出Ticket的所有票证并显示其当前状态(最新的TicketUpdate项目):
列表:
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
修改强>
正如我所看到的,status
中的TicketUpdate
字段是字符字段,因此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
数据。