0

パブリッシュされたすべてのエントリを取得するモデル マネージャを作成しようとしていますが、start_date は の過去ですnow。奇妙なことに、日付を過去 (1 分前) の値に設定するとすべてが機能しますが、将来 (1 分前) の日付を設定すると、さらに待ってもオブジェクトが表示されません。テストに1分以上。サーバーを再起動するだけで、エントリが表示されます。しかし、エントリを公開するたびにサーバーを再起動することはできません。

このコードの何が問題なのか、誰にもわかりますか? または、これは別の方法で行うことができますか?

from django.utils import timezone

now = timezone.now()


def entries_published(queryset):
    """Return only the entries published"""
    return queryset.filter(
        models.Q(start_publication__lte=now) | \
        models.Q(start_publication=None),
        models.Q(end_publication__gt=now) | \
        models.Q(end_publication=None),
        status=PUBLISHED)


class EntryPublishedManager(models.Manager):
    """Manager to retrieve published entries"""

    def get_queryset(self):
        """Return published entries"""
        return entries_published(
            super(EntryPublishedManager, self).get_queryset())



class Entry(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255)
    categories = models.ManyToManyField(Category, related_name='entries', blank=True, null=True)
    creation_date = models.DateTimeField(auto_now_add=True)
    start_publication = models.DateTimeField(blank=True, null=True, help_text="Date and time the entry should be visible")
    end_publication = models.DateTimeField(blank=True, null=True, help_text="Date and time the entry should be removed from the site")    
    status = models.IntegerField(choices=STATUS_CHOICES, default=DRAFT)

    objects = models.Manager()
    published = EntryPublishedManager()

私の見解は次のとおりです。

class EntryListView(ListView):
    context_object_name = "entry_list"
    paginate_by = 20
    queryset = Entry.published.all().order_by('-start_publication') 

編集:

ビューのnow = timezone.now()定義内に移動すると、正しい公開エントリが取得されます。なぜ正しいものが表示されないのですか?entries_publishedCategoryDetailEntryListView

これが私のCategoryDetail見解です

#View for listing one category with all connected and published entries
class CategoryDetail(ListView):

    paginate_by = 20

    def get_queryset(self):
        self.category = get_object_or_404(Category, slug=self.kwargs['slug'])
        return Entry.published.filter(categories=self.category).order_by('-start_publication', 'title')

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super(CategoryDetail, self).get_context_data(**kwargs)
        # Add in the category
        context['category'] = self.category
        return context

2を編集します。

EntryListViewがこれに変更した場合:

class EntryListView(ListView):

    model = Entry

    context_object_name = "news_list"
    paginate_by = 20

    def get_queryset(self):
        return Entry.published.all().order_by('-start_publication')

すべてが機能します。奇妙ですが、私は気にしません。

4

1 に答える 1

0

編集: あなたの問題は、アプリケーションの起動時に = timezone.now() が設定されていることだと思います。entry_published メソッド内で 'now' を定義します。

追加: メソッドを単純化して、クラス メソッドが呼び出されることを確認し、関数定義を完全にスキップすることをお勧めします。

class EntryPublishedManager(models.Manager):
    """Manager to retrieve published entries"""
    def get_queryset(self):
        now = timezone.now()
        return Super(EntryPublishedManager, self).get_queryset().filter(
            models.Q(start_publication__lte=now) | \
            models.Q(start_publication=None),
            models.Q(end_publication__gt=now) | \
            models.Q(end_publication=None),
            status=PUBLISHED)
于 2014-03-12T17:17:52.377 に答える