如何使用 Django Python 通过公共属性对具有多种类型元素 (类) 的查询集(或数组)进行排序

How to sort query set (or array) with more than one type of elements (classes) by common attribute using Django Python

我需要帮助创建一个查询集(或数组),该查询集由一个公共属性作为一种以上类型的元素(不同 类)。

这里是 类:

class aaa(models.Model):
    fd          = models.CharField(max_length=100, unique=True)

    timestamp   = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated     = models.DateTimeField(auto_now_add=True, auto_now=False)

    #more attributes...

    def __str__(self):
        return self.fd

class bbb(models.Model):
    fd      = models.CharField(max_length=100)
    date    = models.DateTimeField(blank=True, null=True)

    #more attributes...

    timestamp   = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated     = models.DateTimeField(auto_now_add=True, auto_now=False)

    class Meta:
        ordering = ["-timestamp"]

    def __str__(self):
        return self.fd

我想按属性 "timestamp" 对所有这些元素进行排序(这在两个 类 中是相同的)。

到目前为止,这是我得到的:

my_objects = (aaa.objects.all(),bbb.objects.all())

创建所有元素的查询集。我更喜欢查询集方式,如果使用数组或其他结构更好,请告诉我。

谢谢!

使用管道合并查询集:

combined = qs1 | qs2 | qs3

但这不适用于来自不同模型的查询集,至少如果它们具有不同的字段则不会。您将收到 Cannot combine queries on two different base models. 错误。

一种可能的解决方案是使用 itertools.chain,如 this blog post,我在此引用以供参考。

from itertools import chain
result_lst = list(chain(queryset1, queryset2))

现在,您可以按任何公共字段对结果列表进行排序,例如创建日期

from operator import attrgetter
result_lst = sorted(
    chain(queryset1, queryset2),
    key=attrgetter('created_at'))