Django ORM查询字段权重?

Posted

技术标签:

【中文标题】Django ORM查询字段权重?【英文标题】:Django ORM query field weight? 【发布时间】:2013-08-01 05:50:24 【问题描述】:

我正在执行以下查询:

People.objects.filter(
    Q(name__icontains='carolina'),
    Q(state__icontains='carolina'),
    Q(address__icontains='carolina'),
)[:9]

我希望查询的第一个结果是名为“Carolina”的人(并且还匹配其他字段,但名称在前)。问题是我认为没有任何方法可以确定字段“权重”或“优先级”。

有什么想法吗? 谢谢!

【问题讨论】:

都没有,客户改变了主意,但 3 个查询是个好方法。 【参考方案1】:

您需要执行 3 次查询才能使其工作:

names_match = People.objects.filter(name__icontains='carolina')[:9]
states_match = People.objects.filter(state__icontains='carolina')[:9]
addresses_match = People.objects.filter(address__icontains='carolina')[:9]

all_objects = list(names_match) + list(states_match) + list(addresses_match)
all_objects = all_objects[:9]

这种方法有两个问题,很容易解决:

    它会进行不必要的查询(如果names_match 已经包含足够的项目怎么办)。 它允许重复(如果北卡罗来纳州的某个人被称为卡罗莱纳州怎么办?)

【讨论】:

对于案例2,他只需要在合并列表之前检查重复项。 另外——一旦你有足够的结果,小心避免第二次或第三次查询——在确定你是否真的有足够的结果之前,你需要检查那里的重复项。 对于第二次或第三次查询,他可以使用先前的结果执行NOT IN。这应该可以解决很多问题。【参考方案2】:

这应该可行:

qs = People.objects.filter(name__icontains='carolina') | People.objects.filter( Q(state__icontains = 'carolina'), Q(address__icontains='carolina')).distinct()
qs = list(qs)[:9]

或者如果你想要一个纯粹的重复空闲列表:

qs = list(set(qs))[:9] #for a duplicate free list

【讨论】:

以上是关于Django ORM查询字段权重?的主要内容,如果未能解决你的问题,请参考以下文章

[Django框架之ORM操作:多表查询,聚合查询分组查询F查询Q查询choices参数]

Django之ORM字段及查询

Django之ORM字段及查询

$Django 聚合函数分组查询F,Q查询orm字段以及参数

Django ORM 查询更新反向多对多字段

如何在不使用字段名的情况下运行 django orm 查询?