是否可以使用Django的QuerySet.values_list引用属性?

Huu*_*uze 13 django properties django-queryset

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

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)
Run Code Online (Sandbox Code Playgroud)

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

people = Person.objects.all().values_list('full_name')
Run Code Online (Sandbox Code Playgroud)

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

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

简而言之,是否可以通过values_list()方法访问自定义属性?如果没有,有没有人有任何关于如何最好地解决这个问题的建议?

zac*_*aca 17

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

[person.fullname for person in Person.objects.all() ] 
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 15

values_list只能在直接从数据库中检索的字段上工作.正如zaca所说,你需要对实际的查询集进行列表理解:

[person.fullname for person in Person.objects.all()]
Run Code Online (Sandbox Code Playgroud)

不要过度使用values_list.这只是一种限制数据库查询的方法,因为当你知道你只需要那些特定的字段时.对于几乎所有用途,获取标准查询集都足够有效.


Ser*_*ach 5

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

people = Person.objects.annotate(
    full_name=Concat(
        'first_name', 
        Value(' '), 
        'last_name'
    ).values_list(
        'full_name'
    )
)
Run Code Online (Sandbox Code Playgroud)