20

我的 Django 模型上有一个自定义属性,它返回一个人的全名:

class Person(models.Model):
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=30)

def _get_full_name(self):
  return "%s %s" % (self.first_name, self.last_name)
full_name = property(_get_full_name)

当我创建查询时,我想引用该属性。例如:

people = Person.objects.all().values_list('full_name')

不幸的是,Django 产生以下 FieldError:

FieldError:无法将关键字“full_name”解析为字段

长话短说,是否可以通过 values_list() 方法访问自定义属性?如果没有,是否有人对如何最好地解决此问题有任何建议?

4

3 回答 3

21

全名不是django模型中的字段,是不可能的。你可以使用列表推导

[person.fullname for person in Person.objects.all() ] 
于 2010-01-26T23:45:15.733 回答
18

values_list只能处理直接从数据库中检索的字段。正如 zaca 所指出的,您需要对实际查询集进行列表理解:

[person.fullname for person in Person.objects.all()]

不要过度使用values_list。它只是作为限制数据库查询的一种手段,因为当您知道您将只需要那些特定字段时。对于几乎所有用途,获取标准查询集就足够高效了。

于 2010-01-27T09:10:55.357 回答
5

全名不是 Django 模型中的字段,因此您可以使用如下注释:

people = Person.objects.annotate(
    full_name=Concat(
        'first_name', 
        Value(' '), 
        'last_name'
    ).values_list(
        'full_name'
    )
)
于 2019-11-28T08:49:52.737 回答