13

我对 Django 很陌生,来自 PHP 世界。我试图在计算完之后向查询集“添加”一个字段,但不知道该怎么做。在 PHP 中,我只需在数组中添加一列并将我的东西存储在其中。

这是我的代码:

def (id):
    mystuff_details    = mystuff_details.objects.filter(stuff_id=id)
    newthing = '';
    for mystuff in mystuff_details:
        newthing_lists = //some query to get another queryset
        for newthing_list in newthing_lists:
            newthing = newthing_list.stuffIwant
            //Here I want to make some computation, and ADD something to newthing, let's say:  
            to_add = (mystuff.score+somethingelse)
            //I've heard about the .append but I'm sure I'm screwing it up
            newthing.append(to_add)

所以基本上在我的模板中我希望能够调用: {% for newthing in newthings_list %} {{ newthing.to_add }} {% end %}

TL;DR:我基本上想从我的数据库中检索一个东西列表,并在这个对象列表中添加一个包含计算值的字段。

如果不清楚,请告诉我,我很难从 php 切换到 django 哈哈。

谢谢!

编辑:

所以,我正在尝试使用字典,但我必须缺少逻辑:

def (id):
    mystuff_details    = mystuff_details.objects.filter(stuff_id=id)
    newthing = {};
    for mystuff in mystuff_details:
        newthing_lists = //some query to get another queryset
        for newthing_list in newthing_lists:
            //Newthing_list can have several times the same I, and the scores need to add up
            if newthing[newthing_list.id] > 0: //This doesn't seem to work and throws an error (KeyError)
                newthing[newthing_list.id] = newthing[newthing_list.id] + some_calculated_thing
            else: 
                newthing[newthing_list.id] = some_calculated_thing

然后当我开始工作时,我不知道如何在模板中访问它:

 {% for id in my_list %}
     {{newthing[id]}} ? Or something like newthing.id ?
 {% end %}

谢谢!

4

3 回答 3

41

您可以在 python 对象上设置任何内容:

for obj in self.model.objects.all() :
    obj.score = total_score / total_posts

即使 obj 没有 score 属性,这也会起作用。在模板请求中是这样的:

{{ obj.score }}

是的,就是这么简单。但是,如果您正在执行的计算可以在数据库中完成,您应该查看annotate

于 2012-08-26T11:58:24.007 回答
3

为什么不用字典?

newthing = {}
newthing['your_key'] = to_add

在模板中,您可以通过以下方式访问字典值:

{{newthing.your_key}}

或者,如果您有字典,请使用 for 循环

于 2012-08-25T03:59:22.823 回答
1

如果@Melvyn 的解决方案对您不起作用:

确保在修改查询集时不要.all()在查询集上调用 etc,因为.all()返回查询集的副本,例如

qs = foo.objects.filter(bar=1); 
for obj in qs.all(): 
    obj.caz = 1;  # Will not persist

现在qs将保持不变。

相当:

qs = foo.objects.filter(bar=1).all(); 
for obj in qs: 
    obj.caz = 1; 

现在您可以.caz在模板中访问。

于 2021-09-08T19:34:47.157 回答