Django:在模板中以特定顺序获取相关模型数据

时间:2014-12-04 06:34:07

标签: django

这是之前question的延续。

我正在制作一个从Bugzilla数据库中提取的错误清理网站。开发人员请求将错误反向移植到不同的分支机构,并且该网站会跟踪请求和清理进度。

主要模型是Bugs,其中包含从Bugzilla复制的所有错误详细信息。

我还拥有所有不同软件分支的Branches模型。

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)

网站上的主页是一张桌子。视图遍历分支,并将具有分支名称的标题单元格按照发送到模板的特定顺序插入到标题列表中。

每个错误都会有一个或多个针对不同分支的解锁请求。首先,我在Bugs模型中为每个分支名称创建了一个单独的字段,但我不希望每次添加或取消分支时都必须编辑模型/视图/模板。

作为替代方案,我添加了一个名为Flags的模型,它对bug_id和分支有一个FK。

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

我还有一个模型Scrub,其中包含每个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)

我需要弄清楚如何做,是从相关模型中获取标志(和擦除)数据,并在显示表时以正确的顺序放置它们。

我目前的想法是,在视图中,遍历每个错误,然后遍历每个分支(我可以按照与标题相同的顺序获取它们)。对于每个分支,检查是否有标记和清理,然后将它们添加到字典中。如果没有标记或磨砂,则字典将只有空字符串作为占位符。每个分支的字典都会添加到“标记”列表中,该列表会添加到该错误的查询集数据中。

然后在模板中,针对每个错误,遍历每个标记/清理列表,并将dict值放入表中的正确单元格中。

表的外观如下:

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

我希望这很清楚。

这是实现这一目标的最佳方式,还是有更好的方法?

1 个答案:

答案 0 :(得分: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 %}