2017-08-14 93 views
2

我想在Django中查詢。
我的模型低於
django queryset自定義註釋(計數)

class Game(models.Model): 
    name = models.CharField(max_length=100) 
    created_at = models.DateTimeField(auto_now_add=True) 

我的情況:

Game(name='League of Legend') 
Game(name='StartCraft') 
Game(name='OverWatch') 

word_list = ["league", "over", "craft", "legend"] 
games = Game.objects.annotate(word_count=blablabla).order_by('-word_count') 

期望的結果的查詢集:

Gmae('League of Legend', 2) 
Game('StartCraft', 1) 
Game('OverWatch', 1) 

有解決辦法? :)

回答

0

該解決方案是不是你想的一樣,但結果看起來不錯,可能是它幫助您找到最好的:

import re 
from django.db.models import Q 

from game.models import Game 

word_list = ["league", "over", "craft", "legend"] 

def convert_camel(name): 
    s1 = re.sub('(.)([A-Z][a-z]+)', r'\1 \2', name) 
    return re.sub('([a-z0-9])([A-Z])', r'\1 \2', s1).lower() 

def word_count(name, word_list): 
    name_norm = convert_camel(name) 
    name_words = name_norm.lower().split() 
    return len(set(name_words) & set(word_list)) 

q = Q() 
for word in word_list: 
    q |= Q(name__icontains=word) 

object_list = Game.objects.filter(q) 

result = [] 
for row in object_list: 
    word_cnt = word_count(row.name, word_list) 
    if word_cnt > 0: 
     result.append({"name": row.name, "word_count": word_cnt}) 

result = sorted(result, key=lambda k: -k['word_count'])