【发布时间】:2015-03-27 05:17:24
【问题描述】:
在这样的模型上对 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 项)
- 按 TicketUpdate__created_time 或 Ticket__created_time 对列表进行排序
- 按 TicketUpdate__priority 或 TicketUpdate__type 或 TicketUpdate__status 过滤列表
我不确定是否必须在 Ticket 或 TicketUpdate 上创建查询集。
我什至不确定是否需要 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')
返回所有现有票证,因为它们都具有初始新状态。我保留了工单的全部历史记录:New、Working、Fixed、NotFixed、Working(再次“工作”:修复无效,用户重新打开票证)
所以我只想按最新状态进行过滤:我需要所有 Working 但如果工单同时具有 Working 和 Fixed 怎么办?我只需要过滤最新的。
【问题讨论】:
标签: python django django-models django-queryset