0

いくつかのテーブルの共通フィールドをグループ化する抽象基本クラスを作成しました。マネージャーを使用して、これらすべてのフィールドを同じ方法でクエリできるようにしたいと思います。

class TemporalModel(models.Model):
    objects = models.Manager()
    today = TodayManager()

    time = models.DateTimeField()

    class Meta:
        abstract = True
        get_latest_by = 'time'

この簡単な例の1つは、上記のように、TemporalModelのサブクラス(すべて「time」フィールドがあります)に今日のエントリを照会できるようにすることです。

したがって、私はマネージャーを書きました:

class TodayManager(models.Manager):
    def get_query_set(self):
        now = timezone.now()
        today = datetime(now.year, now.month, now.day, tzinfo=now.tzinfo)
        tomorrow = today + timedelta(days=1)

        qs = models.Manager.get_query_set(self).filter(time >= today)
        qs = qs.filter(time < tomorrow)

        return qs

これを使用しようとすると、NameError(時間は定義されていません)で失敗します。これは、この質問と同じ理由であると思います。フィールドは抽象クラスではなく、サブクラスにあります。

ただし、これを抽象クラスで実際に呼び出すことはありません。私が次のようなものを持っている場合:

class SomeTemporalThing(TemporalModel):
    pass # I'm a real table! :)

次に、SomeTemporalThing.today.all()などを呼び出して、djangoに子テーブルの時刻>=今日/時刻<明日のルックアップを実行させたいと思います。

マネージャー定義を子クラスに移動せずにこれを達成することは可能ですか(これにより繰り返しが発生します)?

カスタムマネージャーのドキュメントを読んだところ、それは可能であるはずだと示唆されていましたが、その方法については困惑しています。

4

1 に答える 1

2

あなたがしていることは可能であるはずです。表示されているエラーは、Managerオブジェクトの継承に関連しているのではなく、filter()関数の誤った指定に関連していQuerySetます。

それ以外の

qs = models.Manager.get_query_set(self).filter(time >= today)

そのはず

qs = models.Manager.get_query_set(self).filter(time_gte=today)

time < tomorrow同じことがフィルターパラメーターにも当てはまります。

QuerySetAPIのドキュメントを参照してください。

于 2013-01-23T05:41:45.103 に答える