【问题标题】:Django - Order and filter on Foreign KeyDjango - 外键排序和过滤
【发布时间】: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_timeTicket__created_time 对列表进行排序
  • TicketUpdate__priorityTicketUpdate__typeTicketUpdate__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')

返回所有现有票证,因为它们都具有初始新状态。我保留了工单的全部历史记录:NewWorkingFixedNotFixedWorking(再次“工作”:修复无效,用户重新打开票证)

所以我只想按最新状态进行过滤:我需要所有 Working 但如果工单同时具有 Working 和 Fixed 怎么办?我只需要过滤最新的。

【问题讨论】:

    标签: python django django-models django-queryset


    【解决方案1】:

    是的,你真的不需要当前的方法。

    您可以只获取查询集并获取第一项;

    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')
    

    【讨论】:

      【解决方案2】:

      你可以试试:

      用于列出 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
      

      编辑

      如我所见,TicketUpdate 中的status 字段是一个字符字段,因此 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 数据。

      【讨论】:

      • Tnx 但是你最新的查询集太开放了。假设我想查看所有仍然是“新”但不是其他已经“修复”的票:Ticket.objects.filter( ticketupdate__status='New').values('name', 'ticketupdate__status').order_by('ticketupdate__created_time') 将返回所有现有票证,因为它们最初都具有新状态。我相信您的查询集是:“给我所有具有票证更新关系的票证,并且在该关系中它的票证更新状态是新的”。但是我需要“给我所有具有票证更新关系的票证,并且它的 NEWEST票证更新.status 是新的”
      • Ticket.objects.filter(ticketupdate__status='New').values('name', 'ticketupdate__status').order_by('ticketupdate__created_time').first() 应从@MarioSignorino 列表中返回最新值
      • 检查我更新的答案。我希望它能回答你的问题:) @MarioSignorino
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 2012-01-23
      • 1970-01-01
      • 2014-09-11
      • 2018-03-04
      • 2018-01-05
      • 2013-09-05
      相关资源
      最近更新 更多