我正在尝试使用模型中的自定义方法作为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'))
我需要按 field1 , field2 和 custom_method 对总和进行分组。这是可能的还是我必须只使用“真实”字段,如 field1 ......?
答案 0 :(得分:3)
你不能。
values()
根据传递给该模型的字段返回结果集。
如果您将传递任何自定义方法,它将无法工作。
答案 1 :(得分: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})
答案 2 :(得分:1)
不幸的是现在不可能。 Django queryset将您的查询表达式转换为SQL,因此将自定义方法转换为SQL太复杂了。
您可以通过查询集的extra方法实现自定义字段表达 例如:
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.
分组将通过python进行。
另一种方式 - 使用raw qerysets 例如:
MyModel.objects.raw("select max(id) as id, 'some string or expr' as custom_field
from table group by custom_field")