Nhìn vào hàm add_aggregate
trong phạm vi django/db/models/sql/query.py
, đối tượng truy vấn sẽ không được chấp nhận làm giá trị đầu vào.
Thật không may, hiện tại không có cách nào trực tiếp trong Django để tổng hợp/chú thích về số tiền cho một queryset, đặc biệt không phải là một trong số đó được lọc thêm bằng cách nào đó.
Giả sử các mô hình sau:
class Item(models.Model):
name = models.CharField(max_length=32)
class Tag(models.Model):
itemfk = models.ForeignKey(Item, related_name='tags')
name = models.CharField(max_length=32)
class FavoritedTag(models.Model):
user = models.ForeignKey(User)
tag = models.ForeignKey(Tag)
Ngoài ra, bạn không thể chú thích một queryset trên các lĩnh vực được xác định thông qua .extra()
.
Người ta có thể thả vào SQL trong views.py
như vậy:
from testing.models import Item, Tag, FavoritedTag
from django.shortcuts import render_to_response
from django.contrib.auth.decorators import login_required
from django.utils.datastructures import SortedDict
@login_required
def interest_level(request):
ruid = request.user.id
qs = Item.objects.extra(
select = SortedDict([
('interest_level', 'SELECT COUNT(*) FROM testing_favoritedtag, testing_tag \
WHERE testing_favoritedtag.user_id = %s \
AND testing_favoritedtag.tag_id = testing_tag.id \
AND testing_tag.itemfk_id = testing_item.id'),
]),
select_params = (str(ruid),)
)
return render_to_response('testing/interest_level.html', {'qs': qs})
mẫu:
{% for item in qs %}
name: {{ item.name }}, level: {{ item.interest_level }}<br>
{% endfor %}
Tôi thử nghiệm này sử dụng MySQL5. Vì tôi không có chuyên gia SQL mặc dù, tôi muốn được tò mò như thế nào để tối ưu hóa ở đây, hoặc nếu có một cách khác để "làm giảm" số lượng SQL. Có lẽ có một số cách thú vị để sử dụng các tính năng related_name
ở đây trực tiếp trong SQL?
Bạn có nhận được thông báo lỗi không? Bạn có thể cung cấp các mô hình bạn đang làm việc không? – cethegeek
lỗi là "ngoại lệ 'Q' đối tượng không có thuộc tính 'chia' ', geradeausanwalt là funcs tập hợp phải không có đối tượng Q làm đối số. Các mô hình trong câu trả lời của ông là tương tự như tôi. – Evgeny