如何使用 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'))
我需要帮助创建一个查询集(或数组),该查询集由一个公共属性作为一种以上类型的元素(不同 类)。
这里是 类:
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'))