2017-01-11 9 views
1

私はこのthreadを見て、辞書のソートの例を見ました。文脈で辞書を注文するDjango

私はプログラムオブジェクトの辞書を持っており、そのキーはプログラムオブジェクトであり、その値は関連するProjectオブジェクトの数の検索です。

def DepartmentDetail(request, pk): 
    department = Department.objects.get(pk=pk) 
    programmes = Programme.objects.all().filter(department=department).exclude(active=False).order_by('long_name') 
    combi = {} 
    for p in programmes: 
     prj = Project.objects.all().filter(programme=p) 
     combi[p] = str(len(prj)) 
    return render(request, 'sysadmin/department.html',{'department': department, 'programmes': programmes, 'combi': sorted(combi.items())}) 

モデルでは、プログラムは文字列 'long_name'を返します。したがって、文字列キーと文字列値をソートしようとしています。私はそうと、キーと値を取得するテンプレートで

{% for programme, n in combi %} 

これは私にエラーを与えます。..

unorderable types: Programme() < Programme() 

私は本当にpython 3 documentationで、エラーを理解していませんソートされた()メソッドは反復可能なものを受け入れると述べています - なぜこのようなことが起こりますか?

私はこの問題を解決するためにcollections.OrderedDictを見ていますが、なぜこれが機能しないのかを知りたいと思います。

Thanx。

答えて

3

列のインデックスを持つデータベースは、並べ替えで実際に優れています。ほとんどの場合、クライアント側でソートする必要はありません。ほとんどの場合、サーバーでそれを実行できます。面白いことに、あなたはそれをやる方法も明らかに分かっています。

....exclude(active=False).order_by('long_name') # <--- this 

あなたのデータは既にソートされていると思いますが、Python内で再度ソートする必要はありません!

しかし、あなたのコードではるかに大きな問題があります。 Projectの項目のセットを取得してから、そのセットをループして、それらを1つずつもう一度検索します。 200 Projectアイテムがある場合、1つのクエリでも同様にジョブが実行されると200個のクエリが実行されます。関係がある方向に応じてselect_relatedまたはprefetch_relatedを追加するだけです。

あなたのコードは、理想的には私の知る限りただ、重複データが含まれているコンビ見ることができるように、この

department = Department.objects.get(pk=pk) 
    programmes = Programme.objects.all().filter(department=department).exclude(active=False).order_by('long_name') 
    return render(request, 'sysadmin/department.html',{'department': department, 'programmes': programmes,}) 

のようなものでなければなりません。同じものはprogrammesからアクセスできます。 programme.project_set.all() (再び、これはあなたが関係を持っている方向に依存し、あなたのモデルが示されていない)

推奨読書:https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.ForeignKey

+0

私が探しています関連プロジェクトのサーバー側を提供することができますか?もしそうなら、正しい方法は何でしょうか? – Xeberdee

+0

ちょうどコンビの値が何であるかを見ていて、 'annotate(project_count = Count( 'project'))'を追加したように見えるでしょう – Sayse

+0

更新を参照してください – e4c5

0

問題がsortedは道がアイテムを注文できることを期待していることであり、デフォルトでオブジェクトの注文方法を知る方法はありません。あなたは、あなたが私はそれクライアントサイド行うことを示唆している(それは私が考えることができる唯一の方法だと)キー

sorted(combi.items(), key=lambda i: i.long_name) 
+0

これは "unorderable types"エラーを修正するかもしれませんが、あなたは[e4c5の解決策](http://stackoverflow.com/a/41586684/1324033) – Sayse

関連する問題