Django - 订购和过滤外键

时间:2015-01-28 10:34:27

标签: python django django-models django-queryset

在像这样的模型上订购和过滤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上创建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>(再次“正在工作”:该修复无效,用户重新打开故障单)

所以我想根据最新状态进行过滤:我需要所有工作但是如果票证同时具有工作和固定状态会怎么样?我只需要过滤最新的。

2 个答案:

答案 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对象不能同时具有WorkingNew状态。如果您想获取最后更新/创建的对象,请考虑将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数据。