如何在QuerySet中保存额外的变量?

时间:2013-07-11 06:08:17

标签: python django django-models django-templates

例如我有一个查询集说folder=Folder.objects.all()

如何在其中保存一些额外的变量呢

for i in folder:
    i.fcount = 33

这样我就可以轻松地在模板中使用它了:

{% for folder in folders %}{{ folder.fcount }}{% endfor %}

我在我的一个页面中使用了这样的内容:

models.py

class Folder(models.Model):
    employer=models.ForeignKey(Employer)
    name=models.CharField(max_length=100)    
    lastupdate= models.DateTimeField(auto_now=True)

class SavedCandidateManager(models.Manager):
    def itemcount(self,fd):
        return self.filter(folder=fd).count()    

class SavedCandidate(models.Model):
    folder=models.ForeignKey(Folder)    
    candidate=models.ForeignKey(Jobseeker)
    created=models.DateTimeField(auto_now_add = True)
    objects=SavedCandidateManager()

views.py

def folder(request):

    folder=Folder.objects.filter(employer=request.user.employer)
    for i in folder:
        i.fcount=SavedCandidate.objects.itemcount(i)
    return render(request,'employer/pages/candidatefolder.html', {'folders':folder})

candidatefolder.html

 {% for folder in folders %}
<tr>
    <td>         
        <a href="/Folder/{{ folder.id }}/" >{{ folder.name }}</a>            
    </td>
    <td>{{ folder.fcount }}</td>
    <td>{{ folder.lastupdate }}</td>
</tr>
{% endfor %}

这非常有用,因为我可以在forloop外观中轻松地在模板中使用它:

{{ folder.fcount }}

1 个答案:

答案 0 :(得分:1)

您总是可以使用额外的方法,如下所示:

folder=Folder.objects.all().extra(select = {'fcount':33})

因此,对于文件夹查询集中的每个f,您将拥有一些fcount属性。

它的工作方式类似于SQL Alias。

如果您想根据您的模型使用其他一些数据,您必须使用注释(https://docs.djangoproject.com/en/dev/ref/models/querysets/#annotate),可能使用自定义聚合函数(https://docs.djangoproject.com/en/dev/topics/db/aggregation/)。