如何在发送到django中的模板之前在视图中替换queryset中的对象?
模型
class Level(models.Model):
[...]
previous_level = ForeignKey('Level', blank=True, null=True)
class CompletedLevel(models.Model):
user = models.ForeignKey('Auth.user')
level = models.ForeignKey('Level')
result = models.IntegerField()
的观点:
levels = Level.objects.filter(previous_level=None)
for i,level in enumerate(modules):
try:
#if level is completed with result > 80 then replace this level with next level
if CompletedLevel.objects.get(result__gt=80):
modules[i] = Module.objects.get(previous_level=level)
except:
pass
收到错误:
'QuerySet' object does not support item assignment
答案 0 :(得分:0)
您可以发布模块在模板中的使用方式吗?根据karthikr的建议,您应该过滤查询集而不是修改其内部状态,因为QuerySet
实例表示来自DB的对象集合,其内容作为查询集评估时的快照(如果你真的需要修改它,在查询集被评估后检查modules._result_cache
...)。
如果在模板中迭代查询集,您可以编写一个生成器,如:
def modified_module():
for i, module in enumerate(modules):
if [...] :
try:
yield Module.objects.get( [...] )
except:
yield module
else:
yield module
# and iterate on modified_module() in template
或者您可以应对复制版本:
modules = list(modules)
# do modifications