0

これが私のモデルのサブセットです:

class Case(models.Model):
    ... # primary key is named "id"
class Employee(models.Model):
    ... # primary key is named "id"
class Report(models.Model):
    case = ForeignKey(Case, null=True)
    employee = ForeignKey(Employee)
    date = DateField()

特定の従業員を考慮して、すべてのケースのリストを作成し、その従業員が最近報告した日時順に並べます。レポートが存在しないケースは、最後にソートする必要があります。同じ日付(NULLを含む)のケースは、さらに基準でソートする必要があります。

これをDjangoORMAPIで表現できますか?もしそうなら、どのように?

疑似SQLでは、私は欲しいと思います

Select Case.*
From Case some-kind-of-join Report
Where report.employee_id = the_given_employee_id
Group by Case.id
Order by Max(Report.date) Desc /* Report-less cases last */, Case.id /* etc. */

Django ORMでこれを行うには、レポートを通じてケースから従業員への多対多の関係を導入する必要がありますか?

4

1 に答える 1

0

django モデルのすべての関係には、簡単に照会できる逆の関係(注文時を含む) があるため、次のようなことができます。

Case.objects.all().order_by('-report__date', 'another_field', 'a third field')

しかし、これでは特定の 1 人の従業員に関する情報は得られません。あなたはこれを行うことができます:

Case.objects.filter(report__employee__pk=5).order_by('-report__date', 'another_field', 'a third field')

Caseただし、特定の従業員によって編集されていないオブジェクトは返されません。

残念ながら、ネイティブにサブクエリを実行することはできないため、カスタム アノテーション クエリを記述してサブクエリを実行する必要があります (つまり、特定の従業員が最後に編集したオブジェクトの最終注文日)。これはテストされていませんが、一般的な考え方です。

Case \
    .objects \
    .all() \
    .extra(select = {
        "employee_last_edit" : """
            SELECT app_report.date
            FROM app_report
                JOIN app_case ON app_case__id = app_report.case_id
            WHERE app_report.employee_id = %d
        """ % employee.id }) \
    .order_by('-employee_last_edit' , 'something_else')
于 2012-10-30T16:21:47.553 に答える