2011-10-31 17 views
0

データベース内のオブジェクトを検索できるアプリケーションを構築しています(検索するオブジェクトは人物と仮定しましょう)。私がしたいのは、夫婦のような関連するオブジェクトをグループ化することです。言い換えれば、2人の人が同じ姓を共有している場合、彼らは結婚しているとみなされます(素晴らしい例ではありませんが、あなたはそのアイデアを得ます)。姓は、結婚した2人を特定する唯一のものです。 検索結果では、夫婦同士を隣り合わせに表示したい。Djangoに関連するオブジェクトをグループ化する

これは私が欲しいものです、あなたは「ジョン」を検索しましょう:それぞれの名前は、その人のプロフィールページへのリンクである

John Smith - Jane Smith 
John Adams - Nancy Adams 
John Washington 
John Andersson 
John Ryan 

今私が持っているのは、すべてのペアを見つけて、各タプルがペアであるタプルのリストを返す関数です。問題は、検索結果で、ペアになっているすべての名前が2回リストされていることです。 検索クエリ(Person.objects.filter(name__contains = "John"))のクエリを実行し、そのクエリの結果をマッチ関数に送信します。私は元のクエリーセットとマッチ関数の結果の両方をテンプレートに送ります。 私は、マッチ関数がマッチを見つけるすべての人を除外することができると思いますが、わかりませんが、最も効率的な解決策ですか?

は編集:私はコメントで書いたように

、私はマッチさせたい実際の文字列が同一ではありません。自分自身を引用すると:

実際には、私はマッチさせたい文字列ではなく、彼らがより多くの本のように見える 、同一ではない: "foo2は(bar13)" - "とfoo2(bar14)"。つまり、2つの文字列が同じfoo id(2)を持ち、bar idが奇数の場合 (13)の場合、その一致はbar id + 1(14)です。私は

答えて

2

まず、あなたのオブジェクトは、姓でソートを受けるこれらの一致を見つけるために、定期的な 表現を持っている:

def keyfun(p): 
    return p.name.split()[-1] 

persons = sorted(Person.objects.all(), key = keyfun) 

その後GROUPBY使用:

from itertools import groupby 
for lname, persons in groupby(persons, keyfun): 
    print ' - '.join(p.name for p in persons) 

が更新はい、このソリューションをあなたの新しい要件にも適しています。必要なのは、各項目のキーを生成するための安定した方法であり、それをkeyfunの身体を置き換える:

from re import findall 
def keyfun(p): 
    v1, v2 = findall(p.name, '\d+') 
    tot = int(v1) + int(v2) % 2 
    return tot 

、あなたがしなければならないが、各項目のキーを生成する方法のためのあなたの説明は、十分に明確ではありません上記の例であなた自身を理解することができます。

+0

ニースのソリューション!問題は、それが "ラストネーム"(私はOPでこれをより明確にしておくべきである)のように単純ではないということです。実際に、一致させたい文字列は同じではなく、代わりに "foo2(bar13)" - "foo2(bar14)"のようになります。つまり、2つの文字列が同じfoo id(2)を持ち、bar idが奇数(13)ならば、その一致はbar id + 1(14)です。私はこれらのマッチを見つけるために正規表現を持っていますので、あなたのソリューションを私の場合に合わせて拡張することは可能ですか?私はgroupbyの仕組みを100%理解しているわけではありません。 –

関連する問題