いくつかのテーブルの共通フィールドをグループ化する抽象基本クラスを作成しました。マネージャーを使用して、これらすべてのフィールドを同じ方法でクエリできるようにしたいと思います。
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に子テーブルの時刻>=今日/時刻<明日のルックアップを実行させたいと思います。
マネージャー定義を子クラスに移動せずにこれを達成することは可能ですか(これにより繰り返しが発生します)?
カスタムマネージャーのドキュメントを読んだところ、それは可能であるはずだと示唆されていましたが、その方法については困惑しています。