使用django queryset覆盖列值

时间:2014-09-15 11:11:34

标签: python django django-queryset

我有一张表格如下 -

name| age |
----|-----|
A   | 50  |
B   | 60  |
C   | 70  |

我的模型类是 -

class Persons(models.Model):
    p_id = models.AutoField(primary_key=True)
    p_name = models.CharField(max_length=32, null=False)
    p_age = models.IntegerField(null=False)

objects = ManagerEx()

class Meta:
    db_table = u'persons'

我想查询表格,如 -

persons = Persons.objects.all()

但名称应该用'anonymous'覆盖,以便每个人对象p_name的评估结果为'anonymous'

for person in persons:
    name = person.p_name # For all objects name should equal to 'anonymous'

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

如果您想在模板中执行此操作,只需:

<Table>
    <Th>
        <Td>Name</Td>
        <Td>Age</Td>
    </Th>
{% for person in persons %}
    <Tr>
        <Td>Anonymous</Td>
        <Td>person.p_age</Td>
    </Tr>
{% endfor %}
</Table>

如果您想在视图中执行此操作,可以使用原始查询执行此操作,如您在评论中所述。

答案 1 :(得分:0)

您可以使用annotate

from django.db.models import Value, CharField

def get_anonymous:
    persons = Persons.objects.all()
    return persons.annotate(p_name=Value('anonymous', output_field=CharField()))

(使用CharField作为输出,因为与您在Persons模型中使用的类型相同

或者如果您希望有一些条件(仅隐藏孩子的名字):

return queryset.annotate(
            p_name=Case(When(
                p_age__gte=18,
                then=F('p_name')),
                default=Value('anonymous'),
                output_field=CharField()
            ))

在第二种情况下,请记住还要从Case导入Whendjango.db.models