1

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

X = A.objects.all()

Y = A.objects.all() 

results = chain(X,Y)        # Union

现在我想在results. 我怎样才能做到这一点?

4

3 回答 3

2

你的意思是:

X = A.objects.all()

Y = B.objects.all() 

results = chain(X,Y)        # Union

您可以将结果转换为 list()。List 具有排序功能:

ut.sort(key=lambda x: x.count, reverse=True)

更多的

于 2013-07-16T12:24:17.787 回答
2

虽然 python 的方式是使用某种排序,但这通常不是在 Django 中正确的方式。

原因是为了连接两个不同模型的两个查询,您必须将它们转换为列表(正如其他答案所建议的那样)。

虽然这看起来不错,但大多数情况下并非如此,因为您点击了数据库,即数据库被要求提供两个模型的所有元素,以创建两个列表,并将它们加入。

您在一个列表中加入两个模型的最可能原因是因为它们都应该从一个公共模型派生,例如一个抽象模型。这样做,两个模型都有一个自然的公共字段,通过抽象模型的子类获得。

然后可以使用order_by对此类查询进行排序。这更有效,因为查询是惰性的


编辑:

例子:

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()

请注意,在这种情况下,父类不是 Abstract 并且子类不是代理,但是这种选择很大程度上取决于您想要实现的目标。希望这可以帮助。

于 2013-07-16T12:34:35.353 回答
0

您可以尝试创建模型对象的列表,然后按它们的时间戳排序(两个模型必须具有相同的 time_stamp 属性):

l= list(x)+list(y)
l.sort(key=lambda l: l.time_stamp)

希望这是您正在寻找的。

于 2013-07-16T12:22:47.590 回答