Django ORM查询字段权重?

时间:2013-07-31 15:42:51

标签: mysql sql django orm django-views

我正在进行以下查询:

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

我希望查询的第一个结果是名为“Carolina”的人(并且还匹配其他字段,但首先命名)。问题是我认为没有办法确定字段“重量”或“优先级”。

有什么想法吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

您需要执行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]

这种方法存在两个问题,这些问题很容易解决:

  1. 它会执行不必​​要的查询(如果names_match已包含足够的项目,那该怎么办)。
  2. 它允许重复(如果北卡罗来纳州的人被称为卡罗莱纳州会怎么样?)

答案 1 :(得分:1)

这应该有效:

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