2

私には2つのDjangoモデルがあり、大まかに次のように要約されています。

class Thing(Model):
    date_created = DateTimeField()

class ThingDateOverride(Model):
    thing    = ForeignKey(Thing)
    category = ForeignKey(Category)
    override = DateTimeField()

私がやりたいのは、適切なフィールドでソートされThingsた特定のリストを作成することです。そのようなオーバーライドが存在しない場合は、 'sを作成します。CategoryThingDateOverride overrideThingdate_created

言い換えると:

  • のそれぞれについてThing、その/ペアに適切なものが存在する場合はいずれかまたはifQuerySetを保持します。Thing.date_createdoverrideThingDateOverrideThingCategory

  • Thing結果のタイムスタンプでセットを並べ替えます。

これはSQLで実現できますが、エンジン固有のコードを作成することは避けたいと思います。私は現在、ORM(純粋なPython)の周りのロジックを実装していますが、データベースでこれを処理したいと思います。

どうすればいいですか?

4

2 に答える 2

1

そのカテゴリはに保存されていThingDateOverrideますか?はいの場合、Thingオブジェクトにはオーバーライドオブジェクトのないカテゴリがありません。

ThingDateOverrideオブジェクトはすべてのオブジェクトに存在すると仮定しましたThing(したがって、カテゴリはすべてのオブジェクトに割り当てられThingます)。overrideフィールドはNULLにすることができ、date_createdオブジェクトは物事をソートするために使用されます。次に、このコードはoverride、存在する場合、または存在date_createdしない場合で並べ替える必要があります。

Thing.objects.filter(thingdateoverride__category=category).extra(select={'d': 'if(override, override, date_created)'}).order_by('d')

フィールドが存在する場合、または別の列として存在しない場合はフィールドを使用extraして選択し、その列で並べ替えるという考え方です。overridedate_created

注:このコードが機能するのはoverridedate_createdフィールドの名前が異なるため、区別できるためです。そうしないと、MySQLは「フィールド名があいまいです」などのエラーを返し、テーブル名を追加する必要があります。

于 2012-09-22T08:49:27.287 に答える
0

必要に応じThingて、そのモデルから始めて、 逆の関係を使用する必要があります。

Thing.objects.filter(thingdateoverride__category=category).order_by("thingdateoverride__override", "date_created")
于 2012-09-22T05:56:56.023 に答える