是否可以使用Django';s QuerySet.values\u列表?

是否可以使用Django';s QuerySet.values\u列表?,django,properties,django-queryset,Django,Properties,Django Queryset,我在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 = proper

我在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:无法将关键字“全名”解析为字段


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

在django模型中全名不是一个字段,它是不可能的。 您可以使用列表理解

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

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

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

不要过度使用
值\u列表
。它只是一种限制db查询的方法,因为当您知道您只需要这些特定字段时。对于几乎所有的使用,获取标准queryset都足够有效。

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

people = Person.objects.annotate(
    full_name=Concat(
        'first_name', 
        Value(' '), 
        'last_name'
    ).values_list(
        'full_name'
    )
)

我使用此解决方案来筛选中表单字段的选项。这很好。我使用的是is_reporting@property,是的,我意识到我不能使用queryset中的字段。糟糕的是,它必须遍历所有对象,而不是遍历设置为True或False的对象。即使您将其添加到所使用的queryset管理器中,它仍然必须以任何方式遍历每个管理器来计算值。有时,我认为存储最终结果是值得的,这样您就可以查询它了。