6

私は次のようなモデルを持っています:

class Item(models.Model):
    ...
    publish_date = models.DateTimeField(default=datetime.datetime.now)
    ...

そして、次のようなマネージャー:

from datetime import datetime

class ItemManager(Manager):
    def published(self):
        return self.get_query_set().filter(publish_date__lte=datetime.now()

そして、次のようなビュー:

class ItemArchive(ArchiveIndexView):
    queryset = Item.objects.published()
    date_field = 'publish_date'

Item.objects.published()公開されているすべてのクエリセットを呼び出して取得できるという考えItemsです。

問題は、サーバーの起動時にDjangoがdatetime.now()マネージャーで呼び出しを実行し、その値をキャッシュしているように見えることです。したがって、今日が5月24日でItem、公開日が5月23日のを作成し、5月22日にサーバーを起動した場合、その5月23日のアイテムはItemArchiveビューに表示されません。Apacheを再起動するとすぐに、5月23日のアイテムがビューに正しく表示されます。

datetime.now()マネージャーが呼び出されるたびにDjangoを強制的に実行するにはどうすればよいですか?

4

3 に答える 3

13

これはqueryset = Item.objects.published()、クラス変数として定義されているビューが原因であると思います。この行は、ItemArchiveクラスが最初にインポートされたときに1回実行されます。その行を、ビューが呼び出されるたびに実行されるメソッドに移動する必要があります。

于 2012-05-24T16:12:42.910 に答える
4

クラス変数を使用せず、代わりquerysetにオーバーライドしますget_queryset。一般的に、私querysetは少し赤いニシンだと思います。代わりに指定するだけの場合model、Djangoはクエリセットを自動的にに設定しself.model.objects.all()ます。フィルタリングが必要な場合は、100回のうち99回、get_querysetスレッドセーフにするためにオーバーライドする必要があります。代わりに次を試してください。

class ItemArchive(ArchiveIndexView):
    model = Item
    date_field = 'publish_date'

    def get_queryset(self):
        return super(ItemArchive, self).get_queryset().published()
于 2012-05-24T16:50:11.200 に答える
0

まず、使用するだけですmodels.DateTimeField(auto_now_add=True)

編集:

次に、get_queryset方法を使用します。

class ItemArchive(ArchiveIndexView):
    date_field = 'publish_date'

    def get_queryset(self):
        return Item.objects.published()
于 2012-05-24T16:21:27.457 に答える