我有2个模型,即A和B.两个都有一个共同的字段,比如时间戳。
X = A.objects.all()
Y = A.objects.all()
results = chain(X,Y) # Union
现在我想在results
上应用ORDERBY查询。我怎么能这样做?
答案 0 :(得分:2)
你的意思是:
X = A.objects.all()
Y = B.objects.all()
results = chain(X,Y) # Union
您可以将结果转换为list()。列表有订单功能:
ut.sort(key=lambda x: x.count, reverse=True)
答案 1 :(得分:2)
虽然python方式是通过使用某种排序,但这通常不是在Django中执行它的正确方法。
原因是,为了加入两个不同模型中的两个queries,您必须将它们转换为列表(正如其他答案所示)。
虽然这看起来不错,但大部分时间都没有,因为你点击了数据库,即要求数据库提供两个模型的所有元素来创建两个列表,然后加入。
您在一个列表中加入两个模型的最可能原因是,两者都应来自一个通用模型,例如:抽象模型。这样做两个模型都有一个通过抽象模型的子类获得的自然公共字段。
然后可以使用order_by进行此类查询的排序。这更有效,因为queries are lazy。
编辑:
示例:
class Parent(models.Model):
date_field = models.DateField()
def pretty_show():
# returns general behavior
class B(Parent):
# other specific fields
def pretty_show():
# returns specific behavior
class C(Parent):
# other specific fields
def pretty_show():
# returns specific behavior
X = Parent.objects.all().order_by("date_field")
for x in X:
x.pretty_show()
请注意,在这种情况下,Parent类不是Abstract,而childs不是代理,但是这个选择很大程度上取决于您想要实现的目标。希望这会有所帮助。
答案 2 :(得分:0)
您可以尝试创建模型对象列表,然后按照这样的时间戳排序(两个模型必须具有相同的time_stamp属性):
l= list(x)+list(y)
l.sort(key=lambda l: l.time_stamp)
希望这就是你要找的东西。