在QuerySet.values()或values_list()中返回方法的结果



在QuerySet上调用.values()或.values_list()时,您可以传入您想要返回的特定字段,甚至是您想要从相关表中返回的字段。我想要做的是包括在模型上定义的方法的结果,以及一些字段,例如:

class MyModel(models.Model):
    name = models.CharField()
    def favouriteNumber(self):
        return random.randint(1,10)
list(MyModel.objects.all().values('name','favouriteNumber'))
=> [{'name':'Bob', 'favouriteNumber':6}, {'name':'Fred', 'favouriteNumber':4}]

上面没有工作,但这是我想要做的,以同样的方式,模板语言可以像对待字段一样对待没有参数的模型方法。

我想这样做的原因是,这样我就可以将信息传递给前端的JavaScript使用,而不是每次都回调到服务器来检索它。

假设上面(或类似的东西)是不可能的,我知道我可以在之后循环我的values()结果并手动添加额外的信息。最有效(最干净)的方法是什么?

您可能想尝试使用only()而不是values()。像values()一样,它只从数据库中获取指定的字段,但不像values(),它将返回实际的实例对象,您可以调用方法。

这样,无论你是在视图还是模板中循环,除了指定的字段之外,你还可以访问方法。

如果你需要类似字典的结构(比如json.dumps()),你可以在一个推导式中构造它们:

instances = MyModel.objects.only('name')
data = [{'name': instance.name, 
         'favourite': instance.favouriteNumber()} for instance in instances]

相关内容

最新更新