所以,我有两个模型,称为公寓和工作。分别显示两个模型的内容很容易,但我无法弄清楚如何根据日期显示两个模型的混合提要。
jobs = Job.objects.all().order_by('-posted_on')
apartments = Apartment.objects.all().order_by('-date')
职位发布日期由“posted_by”表示,公寓发布日期由“date”表示。如何将这两者结合起来并根据发布日期对它们进行排序?我尝试以更简单的方式组合这两种模型,例如:
new_feed = list(jobs) + list(apartments)
这只是创建了这两个模型的列表,但它们不是按日期排列的。
我建议两种方法来实现这一目标。
使用Django 1.11 中的新功能。使用SQL 的 UNION运算符来组合两个或多个 QuerySets 的结果union()
您需要确保订购的字段具有唯一的名称 Like
date
字段 forjob
and alsoapartment
jobs = Job.objects.all().order_by('-posted_on')
apartments = Apartment.objects.all().order_by('-date')
new_feed = jobs.union(apartments).order_by('-date')
请注意,使用此选项,您需要具有相同的字段名称才能对其进行排序。
或
With chain()
,用于将连续序列视为单个序列并使用sorted()
withlambda
对它们进行排序
from itertools import chain
# remove the order_by() in each queryset, use it once with sorted
jobs = Job.objects.all()
apartments = Apartment.objects.all()
result_list = sorted(chain(job, apartments),
key=lambda instance: instance.date)
使用此选项,您实际上不需要重命名或更改您的字段名称之一,只需添加一个属性方法,让我们选择作业模型
class Job(models.Model):
''' fields '''
posted_on = models.DateField(......)
@property
def date(self):
return self.posted_on
所以现在,你的两个模型都有属性date
,你可以使用chain()
result_list = sorted(chain(job, apartments),
key=lambda instance: instance.date)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句