如何按日期对Django QuerySet输出进行排序?

时间:2019-06-22 09:54:29

标签: python django

我有这样的数据:

此查询创建的数据:

data = Post.objects.filter(post_by=UserID).
       values_list('posted_date_time','post_id')
       .union(post_wishlist.objects.filter(user_id=UserID)
       .values_list('added_date_time', 'post_id'))

我可以更好地查询根据日期提供短数据的地方。

输出

<QuerySet [(datetime.datetime(2019, 6, 14, 20, 4, 58, 104805, tzinfo=<UTC>), UUID('b15be3c1-3f70-4ccb-af08-dba385f883a1')), 
          (datetime.datetime(2019, 6, 12, 18, 42, 38, 675120, tzinfo=<UTC>), UUID('f2ea2ad0-f228-43d7-823a-c824a041feb2')), 
          (datetime.datetime(2019, 6, 12, 17, 46, 38, 479890, tzinfo=<UTC>), UUID('16c66e9b-0cbf-4b6d-b848-78cf771f522c')),
          (datetime.datetime(2019, 6, 21, 20, 17, 15, 785171, tzinfo=<UTC>), UUID ('a169afcf-267b-4212-97e5-6221595ab107')),
          (datetime.datetime(2019, 6, 15, 7, 33, 34, 136331, tzinfo=<UTC>), UUID('9aac6b06-6622-4587-9956-5b517aaa11e8')),
          (datetime.datetime(2019, 6, 18, 16, 11, 49, 134458, tzinfo=<UTC>), UUID('00271b56-9ff7-4f9d-b9c0-2592ca9436d2')), 
          (datetime.datetime(2019, 6, 21, 21, 3, 53, 528261, tzinfo=<UTC>), UUID('df0d8905-5377-4b8d-99d9-eba644273eaa')),
          (datetime.datetime(2019, 6, 21, 21, 4, 6, 256957, tzinfo=<UTC>), UUID('c339d797-f37d-48ff-94a6-e6d1510e23cc')), 
          (datetime.datetime(2019, 6, 18, 17, 10, 18, 388505, tzinfo=<UTC>), UUID('00271b56-9ff7-4f9d-b9c0-2592ca9436d2'))]>

在QuerySet中,我有多个具有UUID的datetime实例

我使用2个不同的模型创建了此数据,并且两个模型都有不同的日期时间字段名称,因此我认为我们不能使用CHAIN。

在这里我想根据日期时间进行排序

非常感谢

1 个答案:

答案 0 :(得分:1)

如果是单个模型,则始终可以使用order_by,这是最好的方法。

class ModelA(models.Model):
    timestamp = models.DateTimeField(default=timezone.now)

ModelA.objects.order_by("timestamp")

如果您有多个具有相似数据(不一定是字段)的模型,则仍然可以使用order_by

class ModelB(models.Model):
    created = models.DateTimeField(default=timezone.now)
    title = models.CharField(max_length=32)


ModelA.objects.values("timestamp").union(
    ModelB.objects.annotate(timestamp=F("created")).values("timestamp")
).order_by("timestamp").values("timestamp")

两个查询中的字段数必须完全相同,并且查询中的相应字段具有相同的数据类型,这一点很重要。 (我在这里使用.values()的次数可能过多。我记不住语法的开头。)

这当然不如sorting it in python可读。

data_a = ModelA.objects.values("timestamp")
data_b = ModelB.objects.annotate(timestamp=F("created")).values("timestamp")

final_data = sorted(data_a + data_b, key=lambda x: x["timestamp"])

请注意,在两种情况下,我都注释了第二个模型并添加了一个名为timestamp的字段,以匹配第一个模型中的名称。它只是使事情变得简单。

order_by与python sorted相比有两个优点

  1. 在大多数情况下它要快得多,因为它发生在数据库 优化以处理此类操作。
  2. 它允许您继续进行查询操作。例如,如果您要 最近的10条结果,您可以.order_by("-timestamp")[10],但是 使用Python,您将必须获取所有数据,然后丢弃 大部分。当您在旅途中时,这可能会非常昂贵且浪费 处理大数据集。