Tôi có mô hình XYZ và tôi cần lấy giá trị lớn nhất cho các trường a, b và biểu thức x/y cho một tập hợp truy vấn đã cho.Truy vấn tổng hợp Django có biểu thức
Nó hoạt động tốt cho các trường. Một cái gì đó như:
>>> XYZ.all().aggregate(Max('a'))
... {'a__max': 10}
Tuy nhiên, tôi không thể tìm cách làm điều đó cho biểu thức. Cố gắng một cái gì đó như:
>>> XYZ.all().aggregate(Max('x/y'))
Cung cấp cho một lỗi:
*** FieldError: Cannot resolve keyword 'x/y' into field. Choices are: a, b, x, y, id
cố gắng một cái gì đó như:
>>> XYZ.all().aggregate(Max(F('x')/F('y')))
Cung cấp cho một lỗi:
*** AttributeError: 'ExpressionNode' object has no attribute 'split'
Và ngay cả cái gì đó như:
XYZ.all().extra(select={'z':'x/y'}).aggregate(Max('z'))
Cũng không hoạt động và cung cấp cho các lỗi tương tự như trên:
FieldError: Cannot resolve keyword 'z' into field. Choices are: a, b, x, y, id
Một hack tôi tìm thấy để làm điều đó là:
XYZ.all().extra(select={'z':'MAX(x/y)'})[0].z
nào thực sự hoạt động vì nó tạo ra đúng SQL, nhưng nó gây nhầm lẫn bởi vì tôi nhận được giá trị đúng tại thuộc tính z, nhưng không phải là một cá thể đúng, cái có giá trị tối đa đó.
Tất nhiên, tôi cũng có thể sử dụng truy vấn thô hoặc thủ thuật với thêm() và order_by(), nhưng nó thực sự không có ý nghĩa với tôi mà Django đi tất cả các cách để hỗ trợ các truy vấn tổng hợp một cách tốt đẹp, nhưng không thể hỗ trợ các biểu thức ngay cả với các biểu thức F của riêng nó.
Có cách nào để làm điều đó không?
Bạn có thể quan tâm để biết rằng khả năng sử dụng 'F()' đối tượng trong uẩn là [một phần của Django 1.8 sắp phát hành] (https://code.djangoproject.com/ wiki/Version1.8Roadmap). –