2012-05-21 50 views
0

我有以下模式:什麼是最有效的視圖和模板?

from django.db import models 
import datetime 

class Club(models.Model): 
    establishment = models.CharField(max_length=200) 
    address = models.CharField(max_length=200) 
    def __unicode__(self): 
     return self.establishment 

class Day(models.Model): 
    club = models.ForeignKey(Club) 
    day = models.DateField('day') 
    def __unicode__(self): 
     return unicode(self.day) 

class Court(models.Model): 
    club = models.ForeignKey(Club) 
    day = models.ForeignKey(Day) 
    court = models.IntegerField(max_length=200) 
    def __unicode__(self): 
     return unicode(self.court) 

class Slot(models.Model): 
    club = models.ForeignKey(Club) 
    day = models.ForeignKey(Day) 
    court = models.ForeignKey(Court) 
    slot = models.TimeField('slot') 
    reservation = models.CharField(max_length=200) 
    def __unicode__(self): 
     return unicode(self.slot) 

在槽模型中,每個「時隙」可以是「開放的」或在「保留」字段具有任何其他值(通常爲電子郵件)。我正在嘗試做的事情是:給出一個傳入函數的club_id,顯示「slot」中預留值爲「open」和「今日」等所有字段,然後傳遞進入模板。

def avail_times(request, club_id): 
    p = get_object_or_404(Slot,pk=club_id) 
    return render_to_response('reserve/templates/avail_times.html', {'times':p}) 

我不能用目前的視圖/模板做到這一點;它只返回一個時間。我如何在視圖中引用「日」和「俱樂部」(給出club_id),然後在模板中顯示上述內容?

回答

0

首先,該查詢不會做你說你想要的。爲了讓當今所有開放式插槽對於給定的俱樂部,你需要這樣的事:

open_slots = Slot.objects.filter(club_id=club_id, day__day=datetime.date.today(), 
           reservation='open') 

現在在你的模板,你可以通過open_slots迭代,並顯示slot時間(你應該選擇一個更好的字段名在這裏)爲每個。順便說一下,我不明白Day模型的要點,或者至少你爲什麼從法院到法院有一個FK。法院在任何一天都是一樣的,唯一與日子有關的事情就是老虎機。同樣的,Day也不需要FK to Club(它現在仍然是星期一,無論你在哪個俱樂部)。事實上,您可以完全刪除Day模型並直接在Slot上使用DateField。

0

您應該使用select_related()檢索相關對象(又名:在foreignKeys)

引用它在你看來,只需鍵入:

club = p.club 

這會給你相關的俱樂部對象(如果你不使用select相關)

你已經擁有存儲在槽對象(p)中的所有信息,其中只有「真實」成員是槽字段(正如你指出的那樣,日期時間字段你看到)

相關問題