ORDERBY统一查询2个django模型

时间:2013-07-16 12:13:35

标签: django django-models

我有2个模型,即A和B.两个都有一个共同的字段,比如时间戳。

X = A.objects.all()

Y = A.objects.all() 

results = chain(X,Y)        # Union

现在我想在results上应用ORDERBY查询。我怎么能这样做?

3 个答案:

答案 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)

more

答案 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)

希望这就是你要找的东西。