2017-03-08 11 views
1

我有Django模型描述在特定的一天的地方,並訪問到那些地方:與ForeignKey的DATE_FIELD基於最新的Django ArchiveView

from django.db import models 

class Place(models.Model): 
    # ... 
    name = models.CharField(max_length=255) 

class Visit(models.Model): 
    # ... 
    place = models.ForeignKey('Place', blank=False) 
    visit_date = models.DateField(blank=False) 

我要顯示所有的地方參觀了一年的時間,所以我使用YearArchiveViewdate_field跨越與訪問次數的關係的嘗試:

from django.views.generic import YearArchiveView 
from myapp.models import Place 

class PlaceYearArchiveView(YearArchiveView): 
    date_field = 'visit__visit_date' 
    model = Place 

然而,這讓我「將沒有名爲‘visit__visit_date’場」。

什麼是最簡單的方法有這種看法使用的queryset這是這樣的(假設d1d2在該年度的第一天和最後一天):

Place.objects.filter(visit__visit_date__gte=d1, visit__visit_date__lte=d2).distinct() 

我可以用一個標準ListView和寫我自己的get_queryset()方法,但如果我可以基於這個看起來更好的YearArchiveView

+0

是否'placeset__visit__visit_date'工作? – Tom

+0

不,結果相似。我之前沒有在過濾器中看到過'placeset__'風格。 –

+0

另請試試:'Place.objects.filter(visit__visit_date__year = 2016).distinct()' – Udi

回答

1

ListView應該足以滿足您的需求,因爲YearArchiveView通常用於日期層次結構,在您的情況下,下一級別爲Place

如果你確實想使用YearArchiveView,你將需要...嗯...玩一下。以下是兩個選項。

假設下面的訪問模式(在一些小的修改):

class Visit(models.Model): 
    place = models.ForeignKey(Place, related_name='visits') 
    date = models.DateField() 

選項1:使用regroup模板標籤:

views.py

class PlaceYearArchiveView(YearArchiveView): 
    date_field = 'date' 
    model = models.Visit 
    make_object_list = True 
    ordering = ('place', 'date') 

visit_archive_year.html

<h1>{{ year.year }}</h1> 
<ul> 
    {% regroup object_list by place as grouped %} 
    {% for group in grouped %} 
     <li> 
      {{ group.grouper.name }} 
      ({% for visit in group.list %}{{ visit.date }}{% if not forloop.last %}, {% endif %}{% endfor %}) 
     </li> 
    {% endfor %} 
</ul> 

選項2:修改`get_dated_items()」

views.py

class PlaceYearArchiveView(YearArchiveView): 
    date_field = 'date' 
    make_object_list = True 
    model = models.Visit 
    ordering = 'place' 

    def get_dated_items(self): 
     items, qs, info = super().get_dated_items() 
     return items, qs.distinct('place'), info 

visit_archive_year.html

<h1>{{ year.year }}</h1> 
<ul> 
    {% for v in object_list %} 
     <li>@{{ v.date }}: {{ v.place.name }}</li> 
    {% endfor %} 
</ul> 
+0

感謝您花時間回答@Udi。這兩種方法都可以做出我想做的事情,但做法略有不同。我想使用'YearArchiveView',以便在上下文中具有'next_year','previous_year'等值。我完全忽略了'make_object_list',這非常重要! –