Django:在模板中以特定顺序获取相关模型数据
问题描述:
这是之前的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
我希望是明确的。
这是实现这个目标的最好方法,还是有更好的方法?
答
这是我想出的,它的工作原理,但我不确定是否有更有效的方法来做到这一点。
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 %}
你为什么不通过分公司在开始过滤器? – 2014-12-07 07:16:00
你的意思是在视图中?我必须显示所有的错误,不管他们被请求的分支。 – zoidberg 2014-12-07 07:54:05