2014-12-04 76 views
0

這是之前的question的延續。Django:在模板中以特定順序獲取相關模型數據

我在做一個從Bugzilla數據庫中抽取的bug scrub網站。開發人員提出請求將錯誤恢復到不同分支,並且該網站會跟蹤請求和清理進度。

主要模型是錯誤,其中包含從Bugzilla複製的所有錯誤詳細信息。

我也有一個所有不同軟件分支的分支模型。

class Branch(models.Model): 
    name = models.CharField(max_length=20) 
    flag_id = models.PositiveSmallIntegerField() 
    flag_name = models.CharField(max_length=100) 
    version = models.CharField(max_length=10) 

該網站的主頁是一張表。該視圖遍歷分支,並將具有分支名稱的標題單元插入到發送到模板的特定順序的標題列表中。

每個bug都會對不同的分支有一個或多個解鎖請求。起初,我在Bugs模型中爲每個分支名稱創建了一個單獨的字段,但我不想每次添加或停用分支時都必須編輯模型/視圖/模板。

所以作爲一個替代方案,我添加了一個名爲Flags的模型,它具有FK到bug_id和分支。

class Flags(models.Model): 
    bug_id = models.ForeignKey(Bugs,related_name='flaglines') 
    branch = models.ForeignKey(Branch) 

我也有一個模型磨砂,其中包含每個bug的磨砂信息。

class Scrub(models.Model): 
    bug_id = models.ForeignKey(Bugs,related_name='scrublines') 
    user = models.ForeignKey(User) 
    time = models.DateTimeField() 
    field = models.CharField(max_length=50) 
    value = models.CharField(max_length=255) 

我需要弄清楚如何做的,是從相關模型得到的標誌(和清理)的數據,並將其放置在正確的順序時被顯示的表。

我目前的想法是,在視圖中,遍歷每個bug,然後遍歷每個分支(我可以按照與標題相同的順序來獲取它們)。對於每個分支,檢查是否存在標誌並擦除,然後將它們添加到字典中。如果沒有標誌或磨砂,字典將只有空字符串作爲佔位符。每個分支的字典都被添加到一個「標記」列表中,該列表被添加到該錯誤的查詢集數據中。

然後在模板中,對於每個錯誤,遍歷每個標記/清理列表,並將字典值放入表格中正確的單元格中。

的表應該是什麼樣子的一個例子是這樣的:

| Bug | Branch 1 | Branch 2 | Branch 3| other fields... 
---------------------------------------------------------- 
| 1234 |   | ?(flag) | +(flag) | other data 
| 2345 | ?(flag) |   | ?(flag) | other data 
| 3456 |   |   | ?(flag) | other data 

我希望是明確的。

這是實現這個目標的最好方法,還是有更好的方法?

回答

0

這是我想出的,它的工作原理,但我不確定是否有更有效的方法來做到這一點。

branches = Branch.objects.filter(is_active=True) 
bugs = Bugs.objects.filter(**filter_kwargs).order_by(*orderby_args) 
for bug in bugs: 
    flags_list = []         # list to hold dictionaries 
    for branch in branches: 
     flags_dict = {'branch':branch}    # dictionary for this branch 
     try: 
      flags_dict['flag'] = bug.flaglines.get(branch=branch) 
     except Flags.DoesNotExist: 
      flags_dict['flag'] = None 
     try: 
      flags_dict['scrub'] = bug.scrublines.get(field=branch.name).value 
     except Scrub.DoesNotExist: 
      flags_dict['scrub'] = None 
     flags_list.append(flags_dict) 
    bug.allflags = flags_list 

然後在模板:

{% for bug in bugs %} 
<tr class="bugrow" > 
    <td><a name="{{bug.bug_id}}">{{bug.bug_id}}</a></td> 
    {% for flag in bug.allflags %} 
     <td>{% if flag.flag %}{{flag.flag}} {%if flag.scrub%}<br>({{flag.scrub}}){%endif%}{%endif%}</td> 
    {% endfor %} 
+0

你爲什麼不通過分公司在開始過濾器? – 2014-12-07 07:16:00

+0

你的意思是在視圖中?我必須顯示所有的錯誤,不管他們被請求的分支。 – zoidberg 2014-12-07 07:54:05