モデルの履歴データが必要なので、simple_history を使用しています。pool_historicalpo_staff という「歴史的」モデルを持つ po_staff というモデルがあります。ここで、pool_historicalpo_staff に基づいて、各従業員の最後のレコードを含むクエリセットを取得したいと考えています (実際のクエリははるかに複雑であるため、できるだけ単純にしようとしました)。私は現在SQLLiteに取り組んでいます
履歴モデルには、次のデータが含まれています。
ID staff_nr valid staff_firstname staff_lastname
1 111 01/01/2014 Firstname1 Lastname1
2 3 01/01/2014 Firstname2 Lastname2
2 3 01/04/2014 Firstname2 Lastname2_new #Employee has changed his Lastname
このコードは正常に動作します (アルファベット順):
qs = po_staff.history.raw ('SELECT * FROM pool_historicalpo_staff '
'WHERE clientID_id is %s and companyID_id is %s '
'GROUP BY id '
'ORDER BY staff_name, staff_surname ',
[client_id, company_id])
staff_nr はユーザーから変更できるため、グループ化には「id」を使用する必要があります (ただし、従業員は同じままです)。
問題 1: ユーザーは、alpabetical と staff_id の間で結果の順序を選択できます
これを可能にするために、クエリに 3 番目の引数を追加しました。
if order == 1:
order_by = "staff_name, staff_surname"
else:
order_by = "staff_nr"
qs = po_staff.history.raw ('SELECT * FROM pool_historicalpo_staff '
'WHERE clientID_id is %s and companyID_id is %s '
'GROUP BY id '
'ORDER BY %s ',
[client_id, company_id, order_by])
クエリは機能しますが、アルファベット順ではなく「id」順に並べられます。
問題 2: 他のモデルに対してもクエリを実行する必要があります。モデルと order_by だけが異なります。すべてのモデルに対してほぼ同じクエリを記述したくないため、より柔軟にしようとしました。
model = .... # instance of current model
order_by = .... # gets the choosen order for current model, p.e. "staff_name, staff_surname"
model_name = .... # gets the model name, p.e. "pool_historicalpo_staff"
qs = model.history.raw ('SELECT * FROM %s '
'WHERE clientID_id is %s and companyID_id is %s '
'GROUP BY id '
'ORDER BY %s ',
[model_name, client_id, company_id, order_by])
このクエリを実行するとエラーが発生します。
Request Method: GET
Request URL: http://127.0.0.1:8000/framework/21/?view=kanban
Django Version: 1.7
Exception Type: OperationalError
Exception Value: near "?": syntax error
Exception Location: c:\python34\lib\site-packages\django\db\backends\sqlite3\base.py in
execute, line 485
Python Executable: c:\python34\python.EXE
Python Version: 3.4.0
すべてを明確に説明したことを願っています。私はdjangoが初めてで、それが私の最初の生のSQLです
助けてくれてどうもありがとう!