Django:对查询集值使用自定义方法()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django:对查询集值使用自定义方法()相关的知识,希望对你有一定的参考价值。

我试图在QuerySet对象的value方法中使用模型中的自定义方法作为字段。

该模型:

class MyModel(models.Model):
    field1
    field2
    field3
    ...

    def custom_method(self):
        return 'somestring'

在另一个模块中,我正在尝试这个:

MyModel.objects.all().values('field1', 'field2', 'custom_method').annotate(field3Tot= Sum('field3'))

我需要按字段1,字段2和custom_method对总和进行分组。这是可能的还是我必须只使用像field1这样的“真实”字段?

答案

不幸的是现在不可能。 Django queryset将您的查询表达式转换为SQL,因此将自定义方法转换为SQL是一项过于复杂的任务。

您可以通过queryset的extra方法实现自定义字段表达式。 例如:

MyModel.objects.extra(select={'custom_field': "'some string or expr'"})
.values('field1', 'field2', 'custom_field')

但是这里不可能使用annotate,查询集提升FieldError: Cannot resolve keyword 'custom_field' into field.分组将通过python进行。

另一种方式 - 使用raw qerysets例如:

MyModel.objects.raw("select max(id) as id, 'some string or expr' as custom_field 
from table group by custom_field")
另一答案

你不能。 values()根据传递给该模型的字段返回结果集。如果您将传递任何自定义方法,它将无法工作。

另一答案

也许有一种更复杂的覆盖/修改QuerySet类的方法

我发现我解决这个问题的方法只是制作一个迭代器

class Person(models.Model):

    first_name = models.CharField(...)
    last_name = models.CharField(...)
    dob = models.DateTimeField(...)

    def full_name(self):
        return self.first_name + ' ' + self.last_name

然后我试图对混合字段和方法做出json响应

 jsonresponse = []
 for person in Person.objects.all():
     jsonresponse.append({"name": person.full_name(), "birthdate" :  person.dob})

 return JsonResponse({"results":jsonresponse})

以上是关于Django:对查询集值使用自定义方法()的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段—— 数组的响应式方法

VSCode自定义代码片段10—— 数组的响应式方法

Visual Studio 自定义代码片段在方法定义的参数列表中不起作用

C# 最有用的(自定义)代码片段是啥? [关闭]

VSCode 配置 用户自定义代码片段 自定义自动代码补充

有啥方法或包我们可以在 django 中对自定义原始 sql 查询执行过滤器(搜索)?