我有这样的数据:
此查询创建的数据:
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。
在这里我想根据日期时间进行排序
非常感谢
答案 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
相比有两个优点
.order_by("-timestamp")[10]
,但是
使用Python,您将必须获取所有数据,然后丢弃
大部分。当您在旅途中时,这可能会非常昂贵且浪费
处理大数据集。