【问题标题】:Django: Filter combined columns with tupleDjango:使用元组过滤组合列
【发布时间】:2017-08-22 15:12:13
【问题描述】:

如何使用 Django ORM 生成这种类型的where 子句?

where (datetime, id) < (%last_datetime, %last_id)

背景

我有一个这样的模型:

class Messages(models.Model):
  # Implicit "id" serial primary key
  datetime = models.DateTimeField(db_index=True)
  message = models.CharField(max_length=1024)

我按datetime 对消息进行排序,并在多条消息具有相同的datetime 时使用id 作为平局断路器以实现一致的排序:

Messages.objects.order_by('datetime', 'id')

现在我需要过滤掉在给定已知消息之前排序的消息。

【问题讨论】:

    标签: python django filter


    【解决方案1】:

    有点复杂,但我想这会起作用:

    Messages.objects.filter(datetime__lte=x).exclude(datetime=x, id__gt=y)
    

    【讨论】:

    • 谢谢。我使用Q 对象提出了类似的解决方案。在接受之前,我会稍等片刻,看看是否有人知道更简单的解决方案,我会检查它是否生成所需类型的查询(或具有类似性能的查询)。
    【解决方案2】:

    您可以使用objects.filter():

    relevant_messages = Messages.objects.filter(datetime__range=[start_date_string, end_date_string])
    

    我也很确定您可以将您的 order_by()filter() 调用链接在一起:

    relevant_messages = Messages.objects.order_by('datetime', 'id').filter(datetime__range=[start_date_string, end_date_string])
    

    【讨论】:

    • 谢谢,但这不起作用,因为它不包括过滤器中的id。我展示的where 子句通过将值组合成关系然后比较关系来工作。这很像在 Python 中比较元组。
    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多