Django: union of different queryset on the same model
我正在对一个模型进行搜索编程,但有一个问题。
我的模型几乎是:
1 2 3 4 | class Serials(models.Model): id = models.AutoField(primary_key=True) code = models.CharField("Code", max_length=50) name = models.CharField("Name", max_length=2000) |
我在数据库中有这样的元组:
1 2 3 4 | 1 BOSTON The new Boston 2 NYT New York journal 3 NEWTON The old journal of Mass 4 ANEWVIEW The view of the young people |
号
如果我搜索字符串
- 首先是以字符串开头的
names 。 - 然后是以字符串开头的
codes 。 - 然后是包含字符串的
names 。 - 然后是包含字符串的
codes 。
因此,上一个列表应按以下方式显示:
1 2 3 4 | 2 NYT New York journal 3 NEWTON The old journal of Mass 1 BOSTON The new Boston 4 ANEWVIEW The view of the young people |
我发现获得这种结果的唯一方法是进行不同的搜索(如果我在一次搜索中放入"或",我会松开我想要的顺序)。
我的问题是,显示结果的模板的代码确实是多余的,而且非常难看,因为我必须对所有4个不同的查询集重复相同的代码。更糟糕的是我不能使用分页!
现在,由于不同查询集的结构是相同的,所以如果有一种方法可以连接4个查询集,并且只给模板一个查询集,那么我将漫游。
您可以进行这四个查询,然后将它们链接到程序中:
1 | result = itertools.chain(qs1, qs2, qs3, qs4) |
但这似乎不太好,因为你必须提出疑问。
也可以使用原始SQL编写自己的SQL,例如:
1 | Serials.objects.raw(sql_string) |
号
另请看这个:
如何在django视图中组合2个或多个查询集?
您还应该能够执行
您可能希望查看的是
1 2 3 4 5 6 | from django.db.models import Q value ="new" Serials.objects.filter(Q(name__startswith=value) | Q(code__startswith=value) | Q(name__contains=value) | Q(code__contains=value).distinct() |
如果你这样做的话,我不确定它是否能处理订单,因为这将依赖于数据库。
事实上,即使使用