6

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

该模型:

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'))

我需要按field1field2custom_method对总和进行分组。这是可能的还是我只能使用像field1这样的“真实”字段......?

4

3 回答 3

3

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

于 2013-11-11T14:11:50.173 回答
3

也许有一种更复杂的方法来覆盖/修改 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})
于 2018-05-24T13:52:16.853 回答
2

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

您可以通过查询集的额外方法来实现自定义字段表达式。
例如:

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

但是这里不能使用annotate,queryset raise FieldError: Cannot resolve keyword 'custom_field' into field.Grouping 会被python 执行。

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

MyModel.objects.raw("select max(id) as id, 'some string or expr' as custom_field 
from table group by custom_field")
于 2013-11-11T15:01:44.910 回答